java.time.zone.ZoneRulesProvider для часовых поясов Microsoft - PullRequest
0 голосов
/ 17 октября 2018

Я кодирую против внешнего API, который возвращает то, что кажется описаниями часовых поясов Windows, в виде строк, например, «Стандартное время романса», и мне нужно разобрать их в java ZoneId s или смещения.Список этих значений доступен здесь .

Документация java.time.ZoneId гласит:

Правила часовых поясов определяются правительствами и часто меняются.Существует ряд организаций, известных здесь как группы, которые отслеживают изменения часовых поясов и сопоставляют их.Группой по умолчанию является База данных часовых поясов IANA (TZDB).Другие организации включают IATA (орган авиационной отрасли) и Microsoft .

Так что мой вопрос заключается в том, существует ли публичная реализация java.time.zone.ZoneRulesProvider от Microsoft, как упоминается вjavadoc?

Мне известно, что существует связь между часовыми поясами Microsoft и стандартным IANA TZDB, см., например, этот вопрос .Но я хочу знать, существует ли стандартная реализация ZoneRulesProvider, которую я могу передать как свойство, как описано в javadoc:

Если системное свойство java.time.Когда будет определено zone.DefaultZoneRulesProvider, оно будет полностью определенным именем конкретного класса ZoneRulesProvider, который будет загружен в качестве поставщика по умолчанию с помощью загрузчика системного класса.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Документы Java верны в том, что IANA, IATA и Microsoft являются источниками информации о часовых поясах.Однако, хотя может быть возможно создание ZoneRulesProvider для каждого из них, насколько я знаю, я не верю, что существуют какие-либо стандартные реализации ZoneRulesProvider для чего-либо, кроме данных IANA.Можно было бы написать, если бы вы были так склонны.

Хотя есть разумное решение.Как и другой вопрос, на который вы ссылались, сопоставления часовых поясов между IANA и Microsoft поддерживаются в файле windowsZones.xml в Unicode CLDR .Эти данные можно использовать для перевода идентификатора часового пояса Microsoft, возвращенного внешним API, в имя часового пояса IANA.Вы можете использовать его напрямую или использовать библиотеку, которая предоставляет вам эту функцию.Хороший выбор библиотеки: Международные компоненты для Unicode (ICU) через реализацию ICU4J , найденную на странице проекта .Это getIDForWindowsID метод ( документы здесь ) использует данные CLDR для обеспечения перевода.

В качестве альтернативы, если вы имеете какое-либо влияние на внешний API, есть вероятность, что он возвращает часовой пояс MicrosoftИдентификаторы, что он построен с использованием .NET.Если это так, вы можете рекомендовать разработчикам этого API возвращать стандартный идентификатор часового пояса IANA в своих результатах API (возможно, в качестве дополнительного поля, если они заинтересованы в совместимости).Моя библиотека с открытым исходным кодом TimeZoneConverter подходит для этой цели и также использует те же данные CLDR.

Обратите внимание, что идентификаторы часовых поясов IANA уже существуют в нескольких областях в Microsoft, включая .NETЯдро на Linux / MacOS, .NET Framework через библиотеки, такие как Noda Time и другие, приложения универсальной платформы Windows (UWP) и некоторые другие.«Часовые пояса Microsoft» - это исторический артефакт, восходящий к самым ранним дням Windows NT.Разработчикам, как правило, следует рекомендовать использовать идентификаторы часовых поясов IANA, а не часовые пояса Microsoft, особенно в API внешних интерфейсов, для обеспечения взаимодействия с системами, отличными от Windows.Более подробную информацию о часовых поясах Microsoft можно найти в тэге часовых поясов wiki .

Кроме того, имейте в виду, что странице, на которую вы ссылались со списком часовых поясов Microsoft, почти десять лет, ивокруг для наследственных целей.Столбцы индекса использовались только на платформах Windows CE, и некоторые из этих часовых поясов больше не существуют.Мы больше не публикуем список этих часовых поясов в виде статической веб-страницы, поскольку данные изменяются слишком часто.Вы всегда можете получить список с любого компьютера Windows с помощью команды TZUTIL /L, или позвонив по номеру TimeZoneInfo.GetSystemTimeZones() в .NET или Powershell, или изучив реестр по адресу HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones.

Полное раскрытие: я помогаюподдерживать часовые пояса в Microsoft, а также несколько библиотек часовых поясов с открытым исходным кодом для .NET.

0 голосов
/ 17 октября 2018

Я нашел эти темы релевантными вашему вопросу, хотя сами вопросы, похоже, не актуальны.Принятые ответы на эти вопросы могут пролить свет на ваш вопрос:

Чрезвычайно медленный анализ часового пояса с новым API java.time

JavaУ меня нет информации обо всех часовых поясах IANA

Похоже, что было бы неплохо создать подкласс ZoneRulesProvider и предоставить собственную реализацию ...

По вашему вопросу я попыталсяискать в Интернете и не найти реализацию ZoneRulesProvider от Microsoft ...

...