Microsoft时区的java.time.zone.ZoneRulesProvider

时间:2018-10-17 14:28:07

标签: java java-8 timezone iana

我正在针对外部API进行编码,该API以字符串形式返回看起来像Windows时区描述的字符串。 “浪漫标准时间”,我需要将其解析为java ZoneId或偏移量。这些值的列表可用here

java.time.ZoneId文档指出:

  

时区规则由政府定义,并且经常更改。   有许多组织(在此称为组)   监视时区更改并进行整理。默认组是   IANA时区数据库(TZDB)。其他组织包括国际航协(   航空业团体)和微软

所以我的问题是,是否存在javadoc中提到的Microsoft java.time.zone.ZoneRulesProvider的公共实现?

我知道Microsoft时区与标准IANA TZDB之间存在关系,例如参见this question。但是我想知道的是,是否存在可以作为属性传递的ZoneRulesProvider的标准实现,如javadoc中所述:

  

如果系统属性java.time.zone.DefaultZoneRulesProvider为   定义,则将其视为混凝土的全限定名称   使用以下方法将ZoneRulesProvider类作为默认提供程序加载   系统类加载器。

2 个答案:

答案 0 :(得分:3)

Java文档是正确的,因为IANA,IATA和Microsoft是时区信息的来源。但是,尽管有可能为每个对象创建一个ZoneRulesProvider,但据我所知,我相信除了IANA数据外,没有任何其他标准的ZoneRulesProvider实现。如果这样的话,可能会写一个。

但是有一个合理的解决方案。正如您提到的另一个问题,IANA和Microsoft之间的时区映射是通过windowsZones.xml file in the Unicode CLDR进行维护的。您可以使用此数据将外部API返回的Microsoft时区ID转换为IANA时区名称。您可以直接使用它,也可以依赖为您提供此功能的库。通过International Components for Unicode (ICU)上的ICU4J实现,一个不错的库选择是project pagegetIDForWindowsID方法(docs here)使用CLDR数据提供翻译。

或者,如果您对外部API有任何影响,则很有可能它返回使用.NET构建的Microsoft时区ID。如果是这样,您可以鼓励该API的开发人员在其API结果中返回标准IANA时区ID(如果他们担心兼容性,则可以将其作为第二字段)。我的开源TimeZoneConverter库适用于此目的,并且还使用相同的CLDR数据。

请注意,Microsoft的一些领域已经使用IANA时区ID,包括Linux / MacOS上的.NET Core,通过Noda Time等库的.NET Framework,通用Windows平台(UWP)应用程序以及其他几个。 “ Microsoft时区”是历史的产物,其历史可以追溯到Windows NT的早期。通常应鼓励开发人员使用IANA时区ID,而不是Microsoft时区,尤其是在与非Windows系统互操作的面向外部的API中。可以在the timezone tag wiki中找到有关Microsoft时区的更多信息。

此外-请注意,您与Microsoft时区列表链接的页面已有近十年的历史,并且该页面出于遗留目的而存在。索引列仅在Windows CE平台上使用过,这些时区中的几个不再存在。我们不再将这些时区的列表发布为静态网页,因为数据更改太频繁了。您始终可以通过命令TZUTIL /L或通过在.NET或Powershell中调用TimeZoneInfo.GetSystemTimeZones()或通过检查HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones处的注册表来从任何Windows计算机中获取列表。

全面披露:我帮助维护Microsoft的时区以及.NET的多个开源时区库。

答案 1 :(得分:1)

我发现这些线索与您的问题相关,尽管问题本身似乎并不相关。这些问题的公认答案可能为您的问题带来启发:

Extremely slow parsing of time zone with the new java.time API

Java doesn't have information about all IANA time zones

子类化ZoneRulesProvider并提供您的自定义实现似乎是个好主意...

对于您的问题,我尝试在线搜索,但没有找到Microsoft的ZoneRulesProvider实现...