我有一个包含设备数据的数据库,每种设备类型都可能为其消息加上不同的时间戳。
具体来说,我有一个包含此时间戳的字符串字段,采用以下两种格式:
2020-01-29T01:30:00.000+11:00
和
2020-01-29T00:30:01.000Z
我正在尝试将这些字符串转换为UTC日期,但是我正在努力确定Carbon的格式。例如,这给了我“数据丢失”错误。
$d = Carbon\Carbon::createFromFormat('Y-m-d\TH:i:s.uP T', '2020-01-29T01:30:00.000+11:00', 'UTC');
我感谢任何建议。谢谢
这是一个简单的错字:您有两个时区标识符,P Difference to Greenwich time (GMT) with colon between hours and minutes (added in PHP 5.1.3)
和T Timezone abbreviation
。选择一个,两个都可以:
$d = Carbon\Carbon::createFromFormat('Y-m-d\TH:i:s.uP', '2020-01-29T01:30:00.000Z', 'UTC');
// object(Carbon\Carbon)(
// 'date' => '2020-01-29 01:30:00.000000',
// 'timezone_type' => 2,
// 'timezone' => 'Z'
// )
$d = Carbon\Carbon::createFromFormat('Y-m-d\TH:i:s.uT', '2020-01-29T01:30:00.000Z', 'UTC');
// object(Carbon\Carbon)(
// 'date' => '2020-01-29 01:30:00.000000',
// 'timezone_type' => 2,
// 'timezone' => 'Z'
// )
$d = Carbon\Carbon::createFromFormat('Y-m-d\TH:i:s.uT', '2020-01-29T01:30:00.000+11:00', 'UTC');
// object(Carbon\Carbon)(
// 'date' => '2020-01-29 01:30:00.000000',
// 'timezone_type' => 1,
// 'timezone' => '+11:00'
// )
$d = Carbon\Carbon::createFromFormat('Y-m-d\TH:i:s.uP', '2020-01-29T01:30:00.000+11:00', 'UTC');
// object(Carbon\Carbon)(
// 'date' => '2020-01-29 01:30:00.000000',
// 'timezone_type' => 1,
// 'timezone' => '+11:00'
// )
这些输入字符串不需要格式。即使没有格式,Carbon和Datetime也会确定此字符串。如果在输入字符串中识别出时区,则也可以省略时区规范“ UTC”。这样便具有优先权。仅当条目不包含任何时区信息时,时区参数才有效。 @aynber的答案中的示例表明了这一点。
$date = new Carbon("2020-01-29T01:30:00.000+11:00");
/*
Carbon::__set_state(array(
'date' => "2020-01-29 01:30:00",
'timezone_type' => 1,
'timezone' => "+11:00",
))
*/
$date = new Carbon("2020-01-29T00:30:01.000Z");
/*
Carbon::__set_state(array(
'date' => "2020-01-29 00:30:01",
'timezone_type' => 2,
'timezone' => "Z",
))
*/
为了识别输入的格式,检查输入字符串比尝试使用Carbon :: createFromFormat的多个变体要好。