Часовой пояс отсутствует в 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.

Другие вопросы по тегам