java.time.zone.ZoneRulesProvider для часовых поясов Microsoft

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

В документации java.time.ZoneId указано:

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

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

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

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


person Luciano    schedule 17.10.2018    source источник


Ответы (2)


Документы 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
comment
Кстати, данные CLDR связаны с Java, по крайней мере, с реализациями на основе OpenJDK, начиная с Java 8. Используется по умолчанию в Java 9 и более поздних версиях. Я не знаю, будет ли это Microsoft-сопоставление доступно без добавления библиотеки ICU4J или нет. - person Basil Bourque; 17.10.2018
comment
Спасибо. Хорошо знать. Но да, вероятно, это бесполезно, если только он не предоставляет такой метод, как getIDForWindowsID - person Matt Johnson-Pint; 17.10.2018
comment
@MattJohnson В итоге я реализовал сопоставление из CLDR xml, как вы и предложили - это не так уж сложно. Однако есть две проблемы: 1) это не биекция; для одного окна tz может быть один или несколько часовых поясов IANA. 2) Это только для одного момента времени (настоящего). Это означает, что сегодняшние карты не обязательно будут такими же, как 50 лет назад. Вот почему я искал официальную реализацию класса java. - person Luciano; 20.10.2018
comment
По пункту 1 вы правы. Вот почему cldr отслеживает общее сопоставление (обозначается 001) и более конкретное сопоставление территории, когда она известна. Что касается пункта 2, баз данных не существовало 50 лет назад. Да, сопоставления со временем меняются, как и часовые пояса. Но обычно они предназначены для того, чтобы быть лучшими известными в настоящее время картами для всех моментов времени. Другими словами, вам не нужен конкретный момент времени, чтобы выяснить, какое сопоставление использовать. Действительно важно быть в курсе изменений, если вы это имели в виду. - person Matt Johnson-Pint; 20.10.2018

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

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

Java не имеет информации обо всем времени IANA зоны

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

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

person wenzi    schedule 17.10.2018