Часовой пояс Олсона в windows

Мне нужно преобразовать часовой пояс из часового пояса olson в Windows. Используя PHP.

Я нашел это http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml

Кажется, что конвертировать с использованием этих данных несложно.

Но есть вопросы:

1) Могу ли я доверять этому источнику?

2) Как разобрать тип с несколькими значениями:

<mapZone other="Eastern Standard Time" territory="US" type="America/New_York America/Detroit America/Indiana/Petersburg America/Indiana/Vincennes America/Indiana/Winamac America/Kentucky/Monticello America/Louisville"/>

Разделены пробелом?

  • Америка / Нью-Йорк
  • Америка / Детройт
  • Америка / Индиана / Петербург
  • Америка / Индиана / Винсеннес
  • Америка / Индиана / Винамак
  • Америка / Кентукки / Монтичелло
  • Америка / Луисвилл

Но почему некоторые зоны состоят из трех компонентов?

3) Всегда там при преобразовании часового пояса Олсона => часовой пояс Windows получит только 1 часовой пояс или, может быть, больше? И что делать в этом случае?

4) Есть ли подводные камни? Например UTC.


person stalxed    schedule 14.12.2014    source источник


Ответы (1)


Да, вы можете доверять этому источнику, и это действительно лучший источник для такого типа преобразования. Я использовал те же данные для реализации функций преобразования для .NET.

Поскольку ваш вопрос касается PHP, я считаю, что это не повторяющийся вопрос - хотя мне любопытно, почему вы хотите сделать это в PHP, поскольку PHP использует часовые пояса IANA / Olson даже в Windows.

Часовые пояса Windows обычно шире, чем зоны IANA, что объясняет, почему в сопоставлении существует несколько значений. Список действительно разделен пробелами, и спецификации CLDR требуют, чтобы первая запись в списке была канонической ссылкой для CLDR.

Почему некоторые зоны состоят из трех компонентов, это не связано с CLDR, но на самом деле это исходные идентификаторы зоны. В Википедии есть хорошее объяснение.

Существует только один идентификатор, идущий от Олсона к Windows, но не обязательно от Windows к Олсону.

Да, есть еще подводные камни:

  • Не все зоны IANA / Olson можно сопоставить с идентификаторами зон Windows. Пример: America/Atikokan

  • CLDR и IANA не согласны с тем, что является каноническим. Канонические идентификаторы CLDR никогда не меняются, в то время как канонические идентификаторы IANA действительно могут быть изменены, заменив предыдущий идентификатор ссылкой. Это немного затрудняет отображение Olson в Windows, потому что вам нужно проверять все ссылки.

    Например, Индия занимает Asia/Calcutta в CLDR. В tzdb IANA он был обновлен до Asia/Kolkata - вместо Asia/Calcutta ссылка. Чтобы отобразить Asia/Kolkata в «Стандартное индийское время» Windows, вы должны сравнить все ссылки для зоны с сопоставлениями.

  • CLDR отображает зону Windows «UTC» в «Etc / GMT». IANA рассматривает Etc/UTC (и другие сокращения) как отдельную зону, а не ссылку. Таким образом, вам придется обрабатывать их вручную.

person Matt Johnson-Pint    schedule 15.12.2014