Часовой пояс отсутствует в i18nFormat
У меня возникла странная проблема с отображением часовых поясов в результатах JSON объектов Time/FrozenTime в CakePHP 3.5 после миграции нашего приложения на PHP 7.2 и в новую серверную среду.
Упрощенный пример возникает при форматировании нового Cake\I18n\Time следующим образом:
(new Time())->i18nFormat("yyyy-MM-dd'T'HH:mm:ssxxx")
Раньше это возвращало бы такую строку:
2020-01-31T10:57:43-07:00
Однако в нашей новой среде тот же код не может вернуть часть часового пояса, вместо этого возвращая такие результаты, как:
2020-01-31T10:57:43
Внутренняя трассировка i18nFormat до Cake\I18n\DateFormatTrait::_formatObject
, похоже, они оба вызывают одни и те же параметры для datefmt_create:
static::$_formatters[$key] = datefmt_create(
'America/Denver',
0,
0,
'America/Denver',
1,
'yyyy-MM-dd\'T\'HH:mm:ssxxx');
Но, похоже, это возвращает разные результаты, часть "xxx" не имеет никакого эффекта.
Есть ли какие-то настройки среды, которые могли бы повлиять на это? Или это вызвано чем-то другим?
Как я могу вернуть часть часового пояса?
1 ответ
Похоже, что версия по умолчанию для серверов PHP в AWS Beanstalk, Amazon Linux/2.9.2, изначально поддерживает только версию ICU 50.1.2-11.12 - которая, похоже, не поддерживает ни одну из строк "x" или "X" в Форматы часовых поясов.
На данный момент я нашел достойный обходной путь - просто используйте вместо нее старую строку "Z", установив формат JSON по умолчанию для объектов времени и даты Cake:
В config/bootstrap.php
:
$customFormat = "yyyy-MM-dd'T'HH:mm:ssZ";
\Cake\I18n\Time::setJsonEncodeFormat($customFormat); // For any mutable DateTime
\Cake\I18n\FrozenTime::setJsonEncodeFormat($customFormat); // For any immutable DateTime
Это не даст идентичных результатов, но это все еще принятый формат ISO8601, который содержит часовой пояс (например,2020-01-31T10:57:43-0700
), а один поддерживается как есть классом Date в javascript.