Часовой пояс Олсона к окнам

Мне нужно преобразовать часовой пояс из часового пояса Олсона в 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"/>

Разделенный на космический характер?

  • Америка / Триатлон
  • Америка /Detroit
  • Америка / Индиана / Петербург
  • Америка / Индиана / Винсенс
  • Америка / Индиана /Winamac
  • Америка /Kentucky/ Монтичелло
  • Америка / Луисвилл

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

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

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

1 ответ

Решение

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

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

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

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

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

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

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

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

    Например, Индия Asia/Calcutta в CLDR. Он был обновлен в tzdb IANA для Asia/Kolkata - замена Asia/Calcutta со ссылкой. На карту Asia/Kolkata в Windows "Стандартное время Индии" необходимо проверить все ссылки для зоны на соответствие.

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

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