Java - 无论JRE版本如何,都可以找到正在使用的tzdata版本

joh*_*nny 7 java timezone

我们有一个简单的实用程序应用程序,它可以读取JRE中使用的所有时区数据,并将其全部显示在一个简单的表中.我们需要使用较旧版本的JRE(6_24)来发布即将发布的产品(由于显然存在其他问题),但我们还需要在该版本中包含更新的时区更新(否则将包含在6_29中) ).我们已经打包了一个将要安装的私有JRE,因此使用TZUpdater工具将时区更新到该私有JRE 不是问题 - 问题是读取/验证tzdata的哪个版本(例如tzdata2010o,tzdata2011k)是正在使用实用程序应用程序读取(即正在运行应用程序的JRE中使用的是哪个版本).该应用程序当前在标题栏中显示JRE版本,但随着时区更新,这已不再足以确定正在使用的时区数据版本.

我查看了TimeZone类,但它似乎没有提供这些信息 - 也许有一个系统属性可以保存这些信息?TZUpdater工具知道正在使用哪个版本,所以它必须在某个地方可用 - 我无法想象他们会在分析中确定更新工具中正在使用哪个版本...有谁知道在哪里找到这个信息?

Mis*_*ith 8

在我的一个JRE中,有一个JRE_PATH\lib\zi名为的文件ZoneInfoMappings.在第一行显示您要查找的数据.

我将寻找一种不那么强硬的方式,如果我找到了什么就会更新答案.

更新:似乎没有API来获取此数据.但是,该类sun.util.calendar.ZoneInfoFile中的代码显示了如何解析它.

  • 在Java 8中,您可以使用`ZoneRulesProvider.getVersions("UTC")`. (3认同)

And*_*eas 5

在Java 8中,您可以使用ZoneRulesProvider.getVersions("UTC")

版本的确切含义和格式是特定于提供程序的。版本必须遵循字典顺序,因此返回的映射将按照从最早的已知规则到最新的可用规则的​​顺序排列。默认的“ TZDB”组使用由年份和字母组成的版本编号,例如“ 2009e”或“ 2012f”。

例:

System.out.println(java.time.zone.ZoneRulesProvider.getVersions("UTC").lastEntry().getKey());
Run Code Online (Sandbox Code Playgroud)

在我的Oracle Java 8u91中,我得到:

2016a