Как конвертировать UT C datetime в BST Time Briti sh Summer Time (BST) Laravel Carbon - PullRequest
1 голос
/ 17 января 2020

Я пытаюсь конвертировать время UT C в BST. Если я прав, отображаются неверные результаты.

$timestamp =  '2020-03-30 16:34:00';
$date = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $timestamp, 'Europe/London');
$date->tz('BST');

$bst =  $date->toDateTimeString();

Выше кодовых выходов 2020-03-30 15: 34: 00 . Обратите внимание, что BST на один час меньше в выводе.

1 Ответ

2 голосов
/ 18 января 2020

PHP не поддерживает BST. Его нет в списке поддерживаемых часовых поясов Европа или других часовых поясов . Я не уверен, почему он не выдает исключение при использовании BST, но документы говорят здесь, что:

Поведение часовых поясов, не перечисленных здесь, undefined.

Также очевидно, что "BST" не работает правильно, потому что, когда вы создаете время с часовым поясом BST, вывод всегда говорит +00:00, даже в летние месяцы:

>>> $date = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', '2020-01-30 16:34:00', 'BST');
=> Carbon\Carbon @1580402040 {#3261
     date: 2020-01-30 16:34:00.0 +00:00,
   }
>>> $date = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', '2020-05-30 16:34:00', 'BST');
=> Carbon\Carbon @1590856440 {#3258
     date: 2020-05-30 16:34:00.0 +00:00,
   }

Однако, когда вы используете часовой пояс Europe/London, на выходе будет сказано +00:00 (по сути, «UT C») в зимние месяцы и +01:00 (по сути, «BST») в летние месяцы:

>>> $date = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', '2020-01-30 16:34:00', 'Europe/London');
=> Carbon\Carbon @1580402040 {#3256
     date: 2020-01-30 16:34:00.0 Europe/London (+00:00),
   }
>>> $date = \Carbon\Carbon::createFromFormat('Y-m-d H:i:s', '2020-05-30 16:34:00', 'Europe/London');
=> Carbon\Carbon @1590852840 {#3251
     date: 2020-05-30 16:34:00.0 Europe/London (+01:00),
   }

Таким образом, часовые пояса, основанные на местоположении, уже учитывают переход на летнее время.

...