Java 将时区列表与时刻同步-timezone.js

Java Synchronize Timezone List with moment-timezone.js

我正在实施一个设置,用户从下拉列表中选择一个时区,然后我的应用程序使用 moment-timezone.js.

显示所选时区的当前时间

我正在使用 TimeZone.getAvailableIDs() 从服务器端检索时区列表以创建下拉列表。但是,moment-timezone.js 无法从列表中解析某些时区 ID。我检查了列表的大小,并将其与 moment-timezone.js 的 moment.tz.names() 进行了比较,发现 moment-timezone.js 的列表比 [=28] 的列表少了大约 30 个 ID =].我怀疑它可能与时区的版本有关,但我不确定,因为我使用的是 Java 7 并且我在 ZoneInfoMappings 中找到的版本是 2014b,而数据文件我暂时有-timezone.js 是 2016f.

有什么方法可以让 Java 和 moment-timezone.js 从同一个列表中检索数据,以便我可以让它们同步?我仅限于 Java 7,无法使用 Java 8 中的 Time,我更喜欢使用原生 Java 库,所以我暂时不考虑 Joda Time。

列表大小不同,因为您实际上是在比较两个相隔两年编写的列表。

如果您想获取 Java/ 的最新 (2016g) 时区列表甚至更新您在 Java 脚本中获得的内容,您可以在此处获取它们 https://www.iana.org/time-zones

如果需要,您可以修改旧版本 (2016f) 网站上列出的 URL。

获得所需的数据文件后,只需将其加载到您的应用程序中即可。

你可以在这里看到:http://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html 使用任何 JDK 6/7/8。您将仅限于版本 2016d。

一些事情:

  • Java 和 Moment-Timezone 使用相同的源数据,tz database from IANA。由于此数据的修订版每年都会发布多次,因此您应该确保保持更新,并在双方使用相同的版本。

  • 使用TZUpdater utility更新Java中的时区数据。

  • 请注意,Java 支持的少数 附加 三字母标识符不是 TZDB 标识符。来自 the JavaDoc on TimeZone:

    Three-letter time zone IDs

    For compatibility with JDK 1.1.x, some other three-letter time zone IDs (such as "PST", "CTT", "AST") are also supported. However, their use is deprecated because the same abbreviation is often used for multiple time zones (for example, "CST" could be U.S. "Central Standard Time" and "China Standard Time"), and the Java platform can then only recognize one of them.

    这些here有更完整的列表,其中一些是TZDB别名,还有一些只存在于Java。

    如果您想将 Java 遗留标识符添加到 moment-timezone,您可以 add them as links,然后您的列表将在两边看起来相同。例如:

    moment.tz.link('Asia/Shanghai|CTT');
    

    但是,更好的做法可能是首先不允许在服务器端使用非标准标识符。