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