PHP Carbon 根据字符串格式确定日期类型
PHP Carbon determine date type from string format
我有一个包含设备数据的数据库,每种设备类型的消息时间戳可能不同。
具体来说,我有一个包含这个时间戳的字符串字段,有以下两种格式:
2020-01-29T01:30:00.000+11:00
和
2020-01-29T00:30:01.000Z
我正在尝试将这些字符串转换为 UTC 日期,但我正在努力识别 Carbon 的格式。例如,这给了我 "data missing" 错误。
$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 的几种变体。
我有一个包含设备数据的数据库,每种设备类型的消息时间戳可能不同。
具体来说,我有一个包含这个时间戳的字符串字段,有以下两种格式:
2020-01-29T01:30:00.000+11:00
和
2020-01-29T00:30:01.000Z
我正在尝试将这些字符串转换为 UTC 日期,但我正在努力识别 Carbon 的格式。例如,这给了我 "data missing" 错误。
$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 的几种变体。