Аббревиатура часового пояса Австралии DST неверна при использовании date_default_timezone_set

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

Вот некоторый тестовый код …

date_default_timezone_set('NZ');
print '<p>NZ time is ' . date('Y-m-d H:i:s T (I)') . '</p>';

date_default_timezone_set('Australia/NSW');
print '<p>NSW time is ' . date('Y-m-d H:i:s T (I)') . '</p>';

date_default_timezone_set('Australia/North');
print '<p>NT time is ' . date('Y-m-d H:i:s T (I)') . '</p>';

date_default_timezone_set('Australia/South');
print '<p>SA time is ' . date('Y-m-d 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)

Теперь аббревиатура часового пояса Новой Зеландии является правильной (NZDT), и все австралийские раз являются правильными, но два австралийских времени, когда летнее время активно (как указано символом формата php date ‘I’, который возвращает ‘1’, если летнее время установлено), все еще показывают аббревиатуру без DST.

Есть идеи?

3

Решение

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

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

    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 для летнего времени.

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

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

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

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]