Углерод не принимает часовой пояс PHP, когда W3c конвертируется в DateTimeString - PullRequest
0 голосов
/ 05 сентября 2018

Когда дата-время ISO-8601 анализируется с parse(), Carbon не читает часовой пояс PHP, когда используется toDateTimeString() (например, для MySQL). Проверьте следующий код:

$date_with_tz = '2018-09-04T19:12:34-04:00';
echo Carbon::parse($date_with_tz)->toW3cString().PHP_EOL;
echo Carbon::parse($date_with_tz)->toDateTimeString().PHP_EOL;
$date_with_tz = '2018-09-04T19:12:34-03:00';
echo Carbon::parse($date_with_tz)->toW3cString().PHP_EOL;
echo Carbon::parse($date_with_tz)->toDateTimeString().PHP_EOL;

[php.date_timezone = 'Америка / Аргентина / Мендоса'] (-03: 00)

Dump

// 2018-09-04T19:12:34-04:00
// 2018-09-04 19:12:34
// 2018-09-04T19:12:34-03:00
// 2018-09-04 19:12:34         <-- Wrong

Ожидаемое

// 2018-09-04T19:12:34-04:00
// 2018-09-04 19:12:34
// 2018-09-04T19:12:34-03:00
// 2018-09-04 20:12:34         <-- OK (expected)

1 Ответ

0 голосов
/ 05 сентября 2018

Я не уверен, что вы думаете, что date_default_timezone_set должен делать здесь, но он не собирается изменять часовой пояс экземпляра DateTime или Carbon, он будет просто по умолчанию, если он не был предоставлен.

date_default_timezone_set('UTC');

// -03:00 (provided via offset in date format)
$dateWithOffset = Carbon::parse('2018-09-04T19:12:34-03:00'); // -03:00

// -04:00 (provided via timezone parameter)
$dateWithTZ = Carbon::parse('2018-09-04T19:12:34', 'America/New_York');

// 00:00 (this is the only one affected by the default setting since no offset or timezone was provided)
$dateWithoutOffset = Carbon::parse('2018-09-04T19:12:34');

Эти 3 экземпляра будут выводить одинаковые числа, если использовать методы формата или toDateTimeString. Ни один из них не изменит часовой пояс при выводе.

Если вы хотите вывести временную метку UTC, используйте метод setTimezone, чтобы преобразовать часовой пояс других экземпляров перед выводом.

$dateWithOffset->setTimezone('UTC')->toDateTimeString()
...