Intereting Posts
Обновление цены автоматически при изменении количества на странице продукта Magento Как предварительно обработать локальный файл CSV перед загрузкой на сервер? Показать видео и миниатюры Youtube в правильном формате 9:16 MySQL LIKE ограничение symfony 2 set locale на основе пользовательских настроек, сохраненных в DB PHP upcasting object symfony2 программно аутентифицирует пользователя PHP «Uninclude» или удалить из памяти? Скрыть опцию выбрать значение на основе значения параметра, выбранного для первых опций Подключение к Redis To Go с PHP Как загрузить несколько файлов с помощью PHP, jQuery и AJAX Передача зашифрованного сервера данных на сервер, между 2 скриптами PHP Удалить дубликаты данных в текстовом файле с помощью php CryptoJS шифрует AES с парольной фразой, но для расшифровки PHP требуется ключ Переменная PHP, определенная в «родительском» файле, не распознанная в «обязательном» файле

Недопустимая аббревиатура сокращенного времени DST для Австралии при использовании date_default_timezone_set

Я пытаюсь представить временную метку UTC в разных часовых поясах, используя функцию date_default_timezone_set PHP. Летнее время только что началось здесь (NZ) и в Австралии, и я получаю смешанные результаты …

Вот несколько тестовых кодов …

date_default_timezone_set('NZ'); print '<p>NZ time is ' . date('Ymd H:i:s T (I)') . '</p>'; date_default_timezone_set('Australia/NSW'); print '<p>NSW time is ' . date('Ymd H:i:s T (I)') . '</p>'; date_default_timezone_set('Australia/North'); print '<p>NT time is ' . date('Ymd H:i:s T (I)') . '</p>'; date_default_timezone_set('Australia/South'); print '<p>SA time is ' . date('Ymd H:i:s T (I)') . '</p>'; 

Из чего я получаю этот вывод …

 NZ time is 2014-10-05 14:04:27 NZDT (1) NSW time is 2014-10-05 12:04:27 EST (1) NT time is 2014-10-05 10:34:27 CST (0) SA time is 2014-10-05 11:34:27 CST (1) 

Теперь аббревиатура часового пояса NZ верна (NZDT), и все австралийские времена верны, но два австралийских времени, когда активна летнее время (как указано символом формата даты «I», который возвращает «1», если летняя экономия на месте) все еще показывают аббревиатуру, отличную от DST.

Есть идеи?

Несколько вещей:

  • Вы можете предпочесть каноническую форму названия часового пояса, когда это возможно. Зоны, которые вы упомянули, на самом деле являются ссылками (aka aliases ). Подробнее см. В этой таблице . В частности:

     NZ => Pacific/Auckland Australia/NSW => Australia/Sydney Australia/North => Australia/Darwin Australia/South => Australia/Adelaide 
  • На самом деле существует 5 основных регионов Австралии с различными правилами часовых поясов. Вы можете обратиться к этой статье в Википедии за подробностями.

  • Australia/Darwin (он же, Australia/North ) не соблюдает летнее время.

  • Остальные два часовых пояса (Сидней и Аделаида) действительно будут на летнее время в указанные вами дату и время. Однако названия и аббревиатуры для часовых поясов Австралии не обязательно были абсолютно ясными. Например, название дневного света в Сиднее было упомянуто следующим образом:

    • Восточное летнее время (EST)
    • Австралийское летнее время (AEST)
    • Восточное дневное время (EDT)
    • Австралийское восточное дневное время (AEDT)
  • PHP вытаскивает свои часовые пояса из базы данных часовых поясов IANA . Сокращения часовых поясов также берутся из одного источника. В течение очень долгого времени в этом наборе данных использовалась двусмысленная аббревиатура «EST» для восточного стандартного времени и восточного летнего времени.

  • Это было недавно изменено в версии 2014f . Вы можете прочитать подробности в примечаниях к выпуску . Теперь он использует AEST для стандартного времени и AEDT для дневного времени.

  • Вы можете получить это изменение, обновив timezonedb PHP до версии 2014.6 или выше. Инструкции по обновлению можно найти здесь или здесь .

  • Кроме того, вы можете просто обновить до последней версии PHP . Основываясь на датах выпуска, я думаю , что PHP-версия 5.3.29 должна была быть отправлена ​​с timezonedb 2014.6. Используйте эту версию или новее, и вы должны получить новые аббревиатуры.

  • Вы также можете вызвать timezone_version_get() чтобы узнать, какая версия timezonedb у вас есть. Для получения новых сокращений должно быть 2014,6 или выше.