Часовой пояс Олсона к окнам
Мне нужно преобразовать часовой пояс из часового пояса Олсона в 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
(и другие сокращения) как отдельная зона - не ссылка. Таким образом, вы должны справиться с этим вручную.