PHP Carbon从字符串格式确定日期类型

问题描述 投票:0回答:2

我有一个包含设备数据的数据库,每种设备类型都可能为其消息加上不同的时间戳。

具体来说,我有一个包含此时间戳的字符串字段,采用以下两种格式:

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');

我感谢任何建议。谢谢

php php-carbon
2个回答
1
投票

这是一个简单的错字:您有两个时区标识符,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'
// )

0
投票

这些输入字符串不需要格式。即使没有格式,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的多个变体要好。

© www.soinside.com 2019 - 2024. All rights reserved.