3

我正在实现一个设置,用户从下拉列表中选择一个时区,然后我的应用程序使用 moment-timezone.js 显示所选时区的当前时间。

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

有没有办法让 Java 和 moment-timezone.js 从同一个列表中检索数据,以便我可以让它们同步?我仅限于 Java 7,不能Time从 Java 8 使用,而且我更喜欢使用本机 Java 库,所以我暂时不考虑 Joda Time。

4

2 回答 2

0

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

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

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

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

您可以在此处查看:http ://www.oracle.com/technetwork/java/javase/tzdata-versions-138805.html 使用任何 JDK 6/7/8。您将被限制为 2016d 版本。

于 2016-10-10T19:10:23.577 回答
0

一些东西:

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

  • 使用TZUpdater 实用程序更新 Java 中的时区数据。

  • 请注意,Java 支持一些额外的三字母标识符用于遗留用途,它们不是 TZDB 标识符。来自TimeZone 上的 JavaDoc

    三个字母的时区 ID

    为了与 JDK 1.1.x 兼容,还支持一些其他的三字母时区 ID(例如“PST”、“CTT”、“AST”)。但是,不推荐使用它们,因为相同的缩写通常用于多个时区(例如,“CST”可能是美国“中部标准时间”和“中国标准时间”),Java 平台只能识别其中之一他们。

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

    如果您想将 Java 遗留标识符添加到时刻时区,您可以将它们添加为 links,然后您的列表在两侧看起来都相同。例如:

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

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

于 2016-10-13T17:49:08.790 回答