19

我正在尝试使用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报告问题

谁能帮我解决这个问题?任何评论将不胜感激。

非常感谢。

4

8 回答 8

11

是的,日本 1948-1951 年的规则在 2018 年以一种“有趣”的方式发生了变化:官方称日本的倒退发生在周六的 25:00,而不是周日的 01:00。这让 Java 时区更新程序以及我自己的 Noda Time 项目感到困惑。

现在承诺在“后卫”格式中避免 25:00 - 后卫格式基本上更保守,避免像爱尔兰的负 DST 之类的事情。

我希望在不久的某个时候发布 2018g 版本,以包含该修复程序。假设 tzupdater 工具适当地使用后卫,我希望它能解决问题。如果你能等到那个时候,我会这样做。否则,使用-ltzupdater 上的标志来指定不同的数据源,例如 2018e:https ://data.iana.org/time-zones/releases/tzdata2018e.tar.gz

于 2018-10-22T16:22:07.120 回答
5

如果您需要使用 2018f 版本而不是亚洲时区,您可以从 2018e 开始使用它,从 2018f 开始使用其他文件。

我已经在我的存储库https://github.com/lucasbasquerotto/my-projects/tree/master/tz中为任何想要避免进行这些手动更改的人创建了文件tzdata2018f-01.tar.gz 。

在使用 OpenJDK 创建 docker 映像时,有一个使用ziupdater的示例,但是如果您使用 Oracle JDK,您应该能够使用几乎相同的代码来使用 tzupdater 更改

java -jar /app/tmp/ziupdater-1.0.1.2.jar -l file:///app/tmp/tzdata2018f-01.tar.gz

java -jar /app/tmp/tzupdater.jar -l file:///app/tmp/tzdata2018f-01.tar.gz

甚至

java -jar tzupdater.jar -l https://github.com/lucasbasquerotto/my-projects/raw/master/tz/tzdata2018f-01.tar.gz

如果您不想手动下载它。

在我的存储库中的示例中,它会生成一个 Docker 映像,但您可以在没有 docker 的情况下使用它,Java 直接安装在您的操作系统中。

我在本地机器(使用 Oracle JDK)上执行了上面的最后一个示例,并且成功更正了时区:

public static void main(String[] args) {        
    System.out.println("Date: " + new Date()); // prints correctly now
}

只要确保您没有使用使用硬编码在自己的 jar 中的时区数据的第三方库(如 Joda Time)(或使用更新的时区数据从源生成 jar,如https://www.joda .org/joda-time/tz_update.html)。

于 2018-10-23T15:49:41.950 回答
5

由于tzdata2018g已经发布了以后卫格式提供的修复程序,请使用tzdata带有 -l 选项的后卫包。

对于tzdata2018g命令将如下所示:
java -jar tzupdater.jar -l https://web.cs.ucla.edu/~eggert/tz/release/2018g/tzdata2018g-rearguard.tar.gz

于 2018-11-23T07:10:29.073 回答
3

这里有同样的问题,问题似乎只是在最新版本上。

使用

java -jar tzupdater.jar -l https://data.iana.org/time-zones/releases/tzdata2018d.tar.gz

(如果“2018d”对你来说足够了)应该可以正常工作。

出于某种原因,在那之后,升级到最新的 tzdata 也可以正常工作(只有一个警告)。

于 2018-10-22T17:01:06.550 回答
1

I was running into the same error, then I fixed the downloaded file from IANA, using the following shell script, which replaces the troublesome line in the file by the previous version of "asia" file, as described by @lucas-basquerotto in his post below. I've tested and it works fine!

Please, download the TZUpdater bundle, extract the tzupdater.jar and update the variable TZUPDATER_JAR with the full file path of the downloaded jar file in order to run the script successfully.

#!/bin/bash

#FULL PATH TO tzupdater.jar
TZUPDATER_JAR='/home/user/tzupdater.jar'

OUTPUT_ALL=$(java -jar $TZUPDATER_JAR -l 2>&1 >/dev/null)
echo "$OUTPUT_ALL" | grep -e "Caused by: tools.tzdb.DateTimeException: Invalid value for SecondOfDay value: 90000" > /dev/null
if [ $? -eq 0 ]
then
        FIXME_FILE=$(echo "$OUTPUT_ALL" | grep -Po "(?<=java.lang.Exception: Failed while parsing file ').+(?=' on line 1655 'Rul)")
        echo "file $FIXME_FILE contains a syntax error"

        ERROR_LINE=$(sed -n '1656,1656p' $FIXME_FILE )
        echo "Line 1655 \"$ERROR_LINE\" contains an error"
        FIXED_LINE=${ERROR_LINE/Sat>=8/Sun>=9}
        FIXED_LINE=${FIXED_LINE/25:00/0:00}
        echo "Line 1655 fixed: \"$FIXED_LINE\" ( rule \"Sat>=8 25:00\" replaced by \"Sun>=9 0:00\" as it was used to be on previous version )"
        sed -i "s/$ERROR_LINE/$FIXED_LINE/" $FIXME_FILE
        TEMP_DIR_NAME=$(dirname $FIXME_FILE)
        cd $TEMP_DIR_NAME
        mkdir tzdata
        mv tzdata.tar.gz tzdata/
        cd tzdata/
        echo "untar original tzdata.tar.gz"
        tar -xf tzdata.tar.gz
        rm tzdata.tar.gz

        FIXME_FILENAME=$(basename $FIXME_FILE)
        echo "replacing original $FIXME_FILENAME file"
        rm $FIXME_FILENAME
        cp ../$FIXME_FILENAME $FIXME_FILENAME
        echo "building a new tar ball with the fixing"
        tar -czf ../tzdata-updated.tar.gz *
        echo "installing the updated tar file (requires elevation sudo)"
        sudo java -jar $TZUPDATER_JAR -l "file:///$TEMP_DIR_NAME/tzdata-updated.tar.gz"
        if [ $? -ne 0 ]
        then
                echo "something went wrong!"
                exit 2
        fi
fi
echo "installation successful!"

Save this is script under the name update_jdk_tzdata.sh and grant it permission to execute: chmod +x update_jdk_tzdata.sh and execute it ./update_jdk_tzdata.sh (it requires sudo in order to update JRE files)

于 2018-10-22T23:49:28.800 回答
-1

使用这些命令:

sudo apt-get install oracle-java8-installer
sudo update-alternatives --config java 

并选择数字 *0(自动)

sudo update-alternatives --config javac

并选择相同的 *0。

如果您已经拥有 tzupdater,则只能查看已经是 2018 的版本

java -jar tzupdater.jar -V
于 2018-10-22T18:58:45.493 回答
-1

如果您在使用日文版时遇到问题,可以使用巴西的另一个链接。java -jar tzupdater.jar -l https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz

于 2018-10-22T17:29:46.473 回答
-1

更新您的 Java 8 版本;tzupdater 工具仅适用于 Java 8 更新 181。

于 2018-10-22T18:25:00.367 回答