Java 文档是正确的,IANA、IATA 和 Microsoft 是时区信息的来源。但是,尽管可以ZoneRulesProvider
为每个创建一个 a,但据我所知,我认为ZoneRulesProvider
除了 IANA 数据之外没有任何标准实现。如果有人愿意的话,可能会写一篇。
不过有一个合理的解决方案。正如您提到的另一个问题,IANA 和 Microsoft 之间的时区映射是通过Unicode CLDR 中的 windowsZones.xml 文件维护的。您可以使用此数据将外部 API 返回的 Microsoft 时区 ID 转换为 IANA 时区名称。您可以直接使用它,也可以依赖为您提供此功能的库。一个好的库选择是International Components for Unicode (ICU),通过项目页面上的ICU4J实现。它的方法(此处的文档)使用 CLDR 数据来提供翻译。getIDForWindowsID
或者,如果您对外部 API 有任何影响,则很有可能它返回的是使用 .NET 构建的 Microsoft 时区 ID。如果是这样,您可以鼓励该 API 的开发人员在其 API 结果中返回标准 IANA 时区 ID(如果他们担心兼容性,可能作为辅助字段)。我的开源TimeZoneConverter库适用于此目的,并且也使用相同的 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,或者通过检查位于 .NET 的注册表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
。
全面披露:我帮助维护 Microsoft 的时区,以及 .NET 的几个开源时区库。