Java使用moment-timezone.js

时间:2016-10-10 18:52:37

标签: java timezone momentjs iana

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

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

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

2 个答案:

答案 0 :(得分: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版本。

答案 1 :(得分:0)

一些事情:

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

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

  • 请注意,Java支持少数附加三字母标识符,用于传统目的,而非TZDB标识符。来自the JavaDoc on TimeZone

      

    三个字母的时区ID

         

    为了与JDK 1.1.x兼容,其他一些三个字母的时区ID(例如" PST"," CTT"," AST")是也支持。但是,它们的使用已被弃用,因为相同的缩写通常用于多个时区(例如," CST"可能是美国和#34;中央标准时间"以及"中国标准时间& #34;),然后Java平台只能识别其中一个。

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

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

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

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

相关问题