- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在针对一个外部 API 进行编码,该 API 将似乎是 Windows 时区描述的内容返回为字符串,例如“浪漫标准时间”,我需要将它们解析为 java ZoneId
或偏移量。这些值的列表可用 here .
java.time.ZoneId
文档指出:
Time-zone rules are defined by governments and change frequently. There are a number of organizations, known here as groups, that monitor time-zone changes and collate them. The default group is the IANA Time Zone Database (TZDB). Other organizations include IATA (the airline industry body) and Microsoft.
所以我的问题是,是否存在 javadoc 中提到的来自 Microsoft 的 java.time.zone.ZoneRulesProvider
的公共(public)实现?
我知道 Microsoft 时区和标准 IANA TZDB 之间存在关系,例如参见 this question .但我想知道的是,是否存在可以作为属性传入的 ZoneRulesProvider
的标准实现,如 javadoc 中所述:
If the system property java.time.zone.DefaultZoneRulesProvider is defined then it is taken to be the fully-qualified name of a concrete ZoneRulesProvider class to be loaded as the default provider, using the system class loader.
最佳答案
Java 文档是正确的,IANA、IATA 和 Microsoft 是时区信息的来源。然而,尽管可以为每个创建一个 ZoneRulesProvider
,但据我所知,我不相信有任何标准的 ZoneRulesProvider
实现比 IANA 数据。如果愿意,可能会写一篇。
虽然有一个合理的解决方案。正如您提到的另一个问题,IANA 和 Microsoft 之间的时区映射是通过 windowsZones.xml file in the Unicode CLDR 维护的。 .您可以使用此数据将外部 API 返回的 Microsoft 时区 ID 转换为 IANA 时区名称。您可以直接使用它,也可以依赖为您提供此功能的库。一个好的图书馆选择是 International Components for Unicode (ICU) , 通过ICU4J在 project page 上找到实现. getIDForWindowsID
方法 ( docs here ) 使用 CLDR 数据提供翻译。
或者,如果您对外部 API 有任何影响,那么它返回的 Microsoft 时区 ID 很可能是使用 .NET 构建的。如果是这样,您可以鼓励该 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 时区的更多信息,请参阅 the timezone tag wiki .
另外 - 请注意,您链接到 Microsoft 时区列表的页面已有将近十年的历史,并且出于遗留目的而存在。索引列仅在 Windows CE 平台上使用过,其中一些时区已不复存在。我们不再将这些时区的列表发布为静态网页,因为数据变化太频繁了。您始终可以通过命令 TZUTIL/L
从任何 Windows 计算机获取列表,或者通过在 .NET 或 Powershell 中调用 TimeZoneInfo.GetSystemTimeZones()
,或者通过检查注册表在 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
。
完全披露:我帮助维护 Microsoft 的时区,以及几个用于 .NET 的开源时区库。
关于Microsoft 时区的 java.time.zone.ZoneRulesProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52857334/
在我的 Rails (3.0) 应用程序中,我使用助手 time_zone_select() 来使用时区。它生成时区名称,如“(GMT+01:00) Paris”... 但这些名称与 MySQL 中的
我正在解析格式为的日期: SimpleDateFormat formatter = new SimpleDateFormat("EE MMM dd HH:mm:ss Z yyyy"); 当我这样做的时
我在 Android 上使用 ACTION_TIMEZONE_CHANGED Intent 过滤器来响应时区更改。 我注意到 Jodas 当前时区此时没有更新,使用:DateTimeZone.getD
我有一个旧版 Windows 应用程序,它从数据库读取数据。其中一列是“TimeZoneInfoId”。在传统世界中,它是由另一个 Windows 应用程序编写的,因此它存储 Windows 字符串:
我是数据库开发新手,目前从事 MySQL 工作。我有一列包含美国的所有时区。我希望能够获取每行中每个时区的当前时间(只有时间,没有日期)。 时区数据如下:+05:00、-03:00 等等 这就是我尝试
我正在尝试了解 session 时区在 PostgreSQL 中的工作原理。 当我将 session 时区设置为“01:00”时,返回日期为“-01:00”。符号总是颠倒的,我不理解这种行为。 这怎么
我写入我的 mongoDB 数据库,例如开始日期,开始日期始终是一周中的星期一(我使用并且我在欧洲中部时区)。 "startDate" : ISODate("2014-12-28T23:00:00Z"
是否有详尽的 MySQL 时区列表? 似乎 MySQL 设置中 time_zone 的有效值取决于主机操作系统,但我一直无法找到可能值的列表。 我需要时间显示卡尔加里本地时间。 最佳答案 默认情况下,
我已经在 config/app.php 中配置了时区至 Europe/Lisbon . 如果我做 return date_default_timezone_get(); , 返回 Europe/Lis
我在整个脚本中广泛使用 unix 时间,通常我将时区设置如下: date_default_timezone_set('Europe/London'); 这一直工作正常,直到上周末时钟回退一个小时,我怀
我有一个字符串,2013-10-07T23:59:51.205-07:00,想将其转换为 Java 日期对象。我收到解析错误。 date = new SimpleDateFormat("yyyy-MM
如何更改日志文件名中的 log4j 时区? 我的 log4j.xml 文件:
在JAVA中,如何确定所有日期都作为GMT日期返回? 例如,即使我尝试使用GMT语言环境强制使用DateFormat,它也会应用某种逻辑来检索BST日期。 public static void mai
好吧,这是我遇到过的最奇怪的错误之一! 首先:我不是 Python 程序员,该脚本是由 friend 编写的(我认为他的大部分内容来自示例)。 该脚本的用途:将日历信息(CET 时间)从 XML 文件
我们有一个网站,目前在某个时间(由用户选择)运行拍卖,这一切都工作正常,因为当服务器到达该时间时,拍卖就会开始。然后我们必须添加时区,具体取决于用户居住的地方。然后,根据所选的下拉菜单,这将增加或减少
我陷入了这个逻辑。我正在开发一个消息调度项目,我的客户来自不同的国家。让我们考虑一下亚洲(不遵守夏令时)和美国/纽约(遵守夏令时)。 现在,我正在编写以下查询来获取距当前时间 10 分钟间隔内的时间表
我尝试返回特定时区的值,但我遇到了一些奇怪的响应行为: SELECT created_at AT TIME ZONE 'US/Pacific' - created_at, NOW() A
我正在尝试将不带时区值(例如“31.05.2015”)的字符串转换为 NSDate。 我的 DateFormatter 有什么问题?它返回日期 2015-05-31 22:00:00 +0000当我尝
我已经成功地将我的本地 tzinfo 导入到 mysql 中,我几乎已经了解了关于如何存储和使用这些数据的所有细节,除了一个字段。有一个名为 Transition_type_id 的数字字段(在表 t
为什么以下行返回的 TimeZone 显示不正确的时间: TimeZone.getTimeZone("America/Ottawa") 现在显示晚上 10:26 [亚特兰大时间现在是 6:26,Ott
我是一名优秀的程序员,十分优秀!