PHP Углерод определяет тип даты из строкового формата - PullRequest
0 голосов
/ 20 марта 2020

У меня есть база данных, которая содержит данные об устройстве, и каждый тип устройства может помечать свои сообщения по-разному.

В частности, у меня есть строковое поле, содержащее эту метку времени, в следующих двух форматах:

2020-01-29T01:30:00.000+11:00

и

2020-01-29T00:30:01.000Z

Я пытаюсь преобразовать эти строки в даты UT C, но я пытаюсь определить форматы для Carbon. Например, это дает мне ошибку «отсутствуют данные».

$d = Carbon\Carbon::createFromFormat('Y-m-d\TH:i:s.uP T', '2020-01-29T01:30:00.000+11:00', 'UTC');

Я ценю любой совет. Спасибо

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Это простая опечатка: у вас есть два идентификатора часового пояса, 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 голосов
/ 20 марта 2020

Не требуется формат для этих строк ввода. Carbon и Datetime определяют эту строку даже без формата. Спецификация часового пояса "UT C" также может быть опущена, если часовой пояс распознается во входной строке. Это тогда имеет приоритет. Параметр часового пояса действует только в том случае, если запись не содержит никакой информации о часовом поясе. Примеры в ответе @ 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.

...