我正在针对一个外部API进行编码,该API以字符串的形式返回似乎是windows时区描述。“浪漫标准时间”(Romance),我需要将它们解析为java ZoneId或偏移量。这些值的列表是可用的这里。
java.time.ZoneId文档声明:
时区规则是由政府定义的,而且变化频繁.有许多组织,在这里被称为组,监测时区的变化并对它们进行整理。默认组是IANA时区数据库(TZDB)。其他组织包括国际航空运输协会(航空工业协会)、和微软。
因此,我的问题是,是否存在微软的java.time.zone.ZoneRulesProvider公开实现,就像javadoc中提到的那样?
我知道微软时区和标准的IANA之间有一种关系,例如见这个问题。但我想知道的是,是否存在ZoneRulesProvider的标准实现,可以作为属性传入,如javadoc中所描述的那样:
如果定义了系统属性java.time.zone.DefaultZoneRulesProvider,则使用系统类加载器将其视为要作为默认提供程序加载的具体ZoneRulesProvider类的完全限定名称。
发布于 2018-10-17 17:37:14
Java文档是正确的,IANA、IATA和Microsoft是时区信息的来源。然而,尽管为每个ZoneRulesProvider创建一个ZoneRulesProvider可能是可能的,但据我所知,我认为除了IANA数据之外,没有任何其他的标准ZoneRulesProvider实现。如果一个人是如此倾向的话,一个人很可能是可以写的。
不过,有一个合理的解决办法。作为您所提到的另一个问题,IANA和微软之间的时区映射是通过Unicode CLDR中的windowsZones.xml文件维护的。您可以使用这些数据将外部API返回的Microsoft时区ID转换为IANA时区名称。您可以直接使用它,也可以依赖为您提供此功能的库。一个很好的库选择是https://en.wikipedia.org/wiki/International_Components_for_Unicode,通过在项目页上找到的ICU4J实现。它的getIDForWindowsID方法(医生来了)使用CLDR数据来提供转换。
或者,如果您对外部API有任何影响,则可能会返回使用.NET构建的Microsoft时区ID。如果是,您可以鼓励该API的开发人员在其API结果中返回标准的IANA时区ID(如果他们担心兼容性,可能会作为次要字段)。我的开源TimeZoneConverter库适合用于此目的,并且也使用相同的CLDR数据。
请注意,IANA时区in已经在微软的几个领域到位,包括Linux/MacOS、通过Noda和其他库的.NET框架、通用Windows (UWP)应用程序以及其他几个。"Microsoft时区“是历史的产物,可以追溯到最早的Windows时代。通常应该鼓励开发人员使用IANA时区in,而不是Microsoft时区,特别是在面向外部的API中,以实现与非Windows系统的互操作性。有关微软时区的更多信息可以在时区标记wiki中找到。
另外,请注意,您与Microsoft时区列表链接的页面已有近十年的历史,并且是为了遗留的目的而出现的。索引列仅在Windows平台上使用,其中几个时区不再存在。我们不再将这些时区的列表作为静态网页发布,因为数据更改太频繁。您始终可以通过命令TZUTIL /L,或通过在.NET或Powershell中调用TimeZoneInfo.GetSystemTimeZones(),或通过在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones上检查注册表,从任何Windows计算机获取列表。
全面披露:我帮助维护微软的时区,以及.NET的几个开源时区库。
发布于 2018-10-17 15:18:11
我发现这些线索与你的问题相关,尽管问题本身似乎并不相关。对这些问题的公认答案可能有助于阐明你的问题:
它似乎是一个好主意,子类ZoneRulesProvider和提供您的定制实现.
关于您的问题,我试图在网上搜索,但没有找到ZoneRulesProvider实现从微软.
https://stackoverflow.com/questions/52857334
复制相似问题