Документы Java верны в том, что IANA, IATA и Microsoft являются источниками информации о часовых поясах. Однако, несмотря на возможность создания ZoneRulesProvider
для каждого из них, насколько мне известно, я не верю, что существуют какие-либо стандартные реализации ZoneRulesProvider
для чего-либо, кроме данных IANA. Можно было бы, вероятно, написать, если бы кто-то был так склонен.
Хотя есть разумное решение. Как упоминалось в другом вопросе, на который вы ссылались, сопоставление часовых поясов между IANA и Microsoft поддерживается через windowsZones.xml в Unicode CLDR. Эти данные можно использовать для преобразования идентификатора часового пояса Microsoft, возвращаемого внешним API, в имя часового пояса IANA. Вы можете использовать его напрямую или взять зависимость от библиотеки, которая предоставляет вам эту функциональность. Хорошей библиотекой будет International Components for Unicode (ICU) , через реализацию ICU4J, найденную на страница проекта. Это getIDForWindowsID
метод (здесь) использует данные CLDR для обеспечения перевода.
В качестве альтернативы, если вы имеете какое-либо влияние на внешний API, есть вероятность, что он возвращает идентификаторы часовых поясов Microsoft, созданные с использованием .NET. Если это так, вы можете предложить разработчикам этого API возвращать стандартный идентификатор часового пояса IANA в своих результатах API (возможно, в качестве дополнительного поля, если они обеспокоены совместимостью). Моя библиотека TimeZoneConverter с открытым исходным кодом подходит для этой цели и также использует те же данные CLDR.
Обратите внимание, что идентификаторы часовых поясов IANA уже используются в нескольких областях Microsoft, включая .NET Core в Linux/MacOS, .NET Framework через библиотеки, такие как Noda Time и другие, приложения универсальной платформы Windows (UWP) и некоторые другие. «Часовые пояса Microsoft» — артефакт истории, восходящий к самым ранним дням Windows NT. Как правило, разработчиков следует поощрять к использованию идентификаторов часовых поясов IANA, а не часовых поясов Microsoft, особенно во внешних API для взаимодействия с системами, отличными от Windows. Дополнительные сведения о часовых поясах Microsoft можно найти в вики тегов часовых поясов.
Кроме того, имейте в виду, что странице, на которую вы ссылались со списком часовых поясов Microsoft, почти десять лет, и она используется для устаревших целей. Столбцы индекса когда-либо использовались только на платформах Windows CE, и некоторые из этих часовых поясов больше не существуют. Мы больше не публикуем список этих часовых поясов в виде статической веб-страницы, потому что данные меняются слишком часто. Вы всегда можете получить список с любого компьютера с Windows с помощью команды TZUTIL /L
, либо вызвав TimeZoneInfo.GetSystemTimeZones()
в .NET или Powershell, либо изучив реестр по адресу HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
.
Полное раскрытие информации: я помогаю поддерживать часовые пояса в Microsoft, а также несколько библиотек часовых поясов с открытым исходным кодом для .NET.
person
Matt Johnson-Pint
schedule
17.10.2018