【发布时间】:2019-03-26 16:01:43
【问题描述】:
我正在尝试使用 TZUpdater 2.2.0 更新 JVM 的时区信息。
> [root@local tzupdater-2.2.0]# java -jar tzupdater.jar -V
tzupdater version 2.2.0-b01
JRE tzdata version: tzdata2018d
tzupdater tool would update with tzdata version: tzdata2018f
所以,我正在运行以下命令:
> [root@local tzupdater-2.2.0]# java -jar tzupdater.jar -l
但是,我收到以下错误消息:
Failed: java.lang.Exception: Failed while parsing file '/tmp/tz.tmp_1/asia' on line 1655 'Rule Japan 1948 1951 - Sep Sat>=8 25:000S'
java.lang.Exception: Failed while parsing file '/tmp/tz.tmp_1/asia' on line 1655 'Rule Japan 1948 1951 - Sep Sat>=8 25:00 0 S'
at tools.tzdb.TzdbZoneRulesCompiler.parseFile(TzdbZoneRulesCompiler.java:377)
at tools.tzdb.TzdbZoneRulesCompiler.compile(TzdbZoneRulesCompiler.java:191)
at tools.tzdb.TzdbZoneRulesCompiler.<init>(TzdbZoneRulesCompiler.java:307)
at com.sun.tools.tzupdater.ExternalModule.compileToJSRBinary(ExternalModule.java:153)
at com.sun.tools.tzupdater.TimezoneUpdater.run(TimezoneUpdater.java:230)
at com.sun.tools.tzupdater.TimezoneUpdater.main(TimezoneUpdater.java:634)
Caused by: tools.tzdb.DateTimeException: Invalid value for SecondOfDay value: 90000
at tools.tzdb.ChronoField.checkValidValue(ChronoField.java:173)
at tools.tzdb.LocalTime.ofSecondOfDay(LocalTime.java:210)
at tools.tzdb.TzdbZoneRulesCompiler.parseMonthDayTime(TzdbZoneRulesCompiler.java:475)
at tools.tzdb.TzdbZoneRulesCompiler.parseRuleLine(TzdbZoneRulesCompiler.java:399)
at tools.tzdb.TzdbZoneRulesCompiler.parseFile(TzdbZoneRulesCompiler.java:354)
... 5 more
我使用https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz 作为 tzdata 包的来源。
已编辑 - 此外,我正在使用 Java(TM) SE 运行时环境(内部版本 1.8.0_66-b17)和 OpenJDK 运行时环境(内部版本 1.8.0_181-8u181-b13-1 ~deb9u1-b13),同时我使用 TZUpdater 或 ZIUpdater 报告了同样的问题
谁能帮我解决这个问题?任何意见将不胜感激。
非常感谢。
【问题讨论】:
-
虽然您没有解决此问题,但您可以根据 GMT 手动更改您的时区,例如在 Java 选项中定义
-Duser.timezone=GMT[-03:00](而不是-Duser.timezone=America/Sao_Paulo(或无),例如) .请记住,当 11 月 4 日到来时,您必须删除此更改(我假设您使用的是巴西时区,基于您在其他答案上的 cmets),否则您的应用程序将比应有的时间少 1 小时。 -
@LucasBasquerotto 我们正在使用这种姑息疗法。然而,使用此解决方案的系统是为了提高生产力并影响多个消费者。我们需要一个更强大、更自动化的解决方案。此时,我同时使用
d和eIANA 参考版本。但是 JVM 忽略了旧版本和它使用来自 SO 的另一个时区来源。 -
在我的情况下,由于您提到的问题,我使用了 IANA
2018f,除了使用asia的2018e。我也想要一个自动化的解决方案,并且只给出这个评论作为一个快速的即时解决方案。在我的例子中,IANA2018e和2018f适用于 java 时间,但不适用于 JodaTime (joda.org/joda-time/tz_update.html)。-Duser.timezone=GMT[-03:00]的方法也适用于 JodaTime。我正在考虑从 JodaTime 迁移到 Java8 Time,这可能会得到解决,而不需要这种姑息解决方案。