Я пытаюсь представить временную метку 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
) не соблюдает летнее время.
Остальные два часовых пояса (Сидней и Аделаида) действительно будут на летнее время в указанные вами дату и время. Однако названия и аббревиатуры для часовых поясов Австралии не обязательно были абсолютно ясными. Например, название дневного света в Сиднее было упомянуто следующим образом:
PHP вытаскивает свои часовые пояса из базы данных часовых поясов IANA . Сокращения часовых поясов также берутся из одного источника. В течение очень долгого времени в этом наборе данных использовалась двусмысленная аббревиатура «EST» для восточного стандартного времени и восточного летнего времени.
Это было недавно изменено в версии 2014f . Вы можете прочитать подробности в примечаниях к выпуску . Теперь он использует AEST для стандартного времени и AEDT для дневного времени.
Вы можете получить это изменение, обновив timezonedb PHP до версии 2014.6 или выше. Инструкции по обновлению можно найти здесь или здесь .
Кроме того, вы можете просто обновить до последней версии PHP . Основываясь на датах выпуска, я думаю , что PHP-версия 5.3.29 должна была быть отправлена с timezonedb 2014.6. Используйте эту версию или новее, и вы должны получить новые аббревиатуры.
Вы также можете вызвать timezone_version_get()
чтобы узнать, какая версия timezonedb у вас есть. Для получения новых сокращений должно быть 2014,6 или выше.