用于 Microsoft 时区的 java.time.zone.ZoneRulesProvider

2023-12-01

我正在针对外部 API 进行编码,该 API 将看似 Windows 时区描述的内容返回为字符串,例如“浪漫标准时间”,我需要将它们解析为javaZoneIds 或偏移量。这些值的列表可用here.

The java.time.ZoneId文档指出:

时区规则由政府定义并经常变化。 有许多组织(此处称为团体) 监控时区变化并整理它们。默认组是 IANA 时区数据库 (TZDB)。其他组织包括国际航空运输协会(IATA) 航空业机构)和微软.

所以我的问题是,是否存在公开实施java.time.zone.ZoneRulesProvider正如 javadoc 中提到的那样,来自 Microsoft?

我知道 Microsoft 时区和标准 IANA TZDB 之间存在关系,请参见示例这个问题。但我想知道是否存在一个标准实现ZoneRulesProvider我可以作为属性传递,如 javadoc 中所述:

如果系统属性 java.time.zone.DefaultZoneRulesProvider 为 定义后,它被视为具体的完全限定名称 要作为默认提供程序加载的 ZoneRulesProvider 类,使用 系统类加载器。


Java 文档正确地指出 IANA、IATA 和 Microsoft 是时区信息的来源。然而,尽管有可能ZoneRulesProvider据我所知,为每个人创建,我不相信有任何标准ZoneRulesProviderIANA 数据以外的任何内容的实现。如果有人愿意的话,也许可以写一篇。

不过有一个合理的解决方案。正如您提到的另一个问题,IANA 和 Microsoft 之间的时区映射是通过Unicode CLDR 中的 windowsZones.xml 文件。您可以使用此数据将外部 API 返回的 Microsoft 时区 ID 转换为 IANA 时区名称。您可以直接使用它,也可以依赖为您提供此功能的库。一个好的图书馆选择是Unicode 国际组件 (ICU),通过ICU4J执行发现于项目页面. It's getIDForWindowsID方法 (文档在这里)使用 CLDR 数据来提供翻译。

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

请注意,IANA 时区 ID 已在 Microsoft 的多个领域中使用,包括 Linux/MacOS 上的 .NET Core、通过 Noda Time 等库的 .NET Framework、通用 Windows 平台 (UWP) 应用程序等。 “Microsoft 时区”是历史的产物,可以追溯到 Windows NT 的早期。通常应鼓励开发人员使用 IANA 时区 ID,而不是 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 的多个开源时区库。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用于 Microsoft 时区的 java.time.zone.ZoneRulesProvider 的相关文章

随机推荐