我正在尝试使用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
也遇到了同样的问题有人可以帮我解决这个问题吗?任何评论将不胜感激。
非常感谢。
答案 0 :(得分:11)
是的,1948-1951年日本的规则在2018f中以“有趣”的方式进行了更改:正式地,日本的退避发生在星期六的25:00,而不是星期日的01:00。这使Java时区更新程序以及我自己的Noda Time项目感到困惑。
现在有了commit to avoid 25:00 in the "rearguard" format-后卫格式基本上更加保守,避免了爱尔兰负面的DST。
我希望很快就会在某个时候发布2018g版本,以包含该修复程序。假设tzupdater工具适当地使用了后卫,我希望可以解决这个问题。如果您可以等到那时,我会这样做。否则,请使用tzupdater上的-l
标志来指定其他数据源,例如对于2018年:https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz
答案 1 :(得分:5)
如果您需要使用2018f版本而不是亚洲时区,则可以使用2018e版本以及2018f版本中的其他文件。
我已经在我的存储库tzdata2018f-01.tar.gz中为所有想要避免进行手动更改的人创建了文件https://github.com/lucasbasquerotto/my-projects/tree/master/tz。
有一个使用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会直接安装在您的OS中。
我在本地计算机(使用Oracle JDK)上执行了以上最后一个示例,并成功更正了时区:
public static void main(String[] args) {
System.out.println("Date: " + new Date()); // prints correctly now
}
只需确保您没有使用一些第三方库(例如Joda Time),该库使用在其自己的jar中硬编码的时区数据(或从源中生成具有更新的时区数据的jar,例如{{3} }。
答案 2 :(得分:4)
由于tzdata2018g已经以后卫格式提供了此修复程序,因此,请使用带有-l选项的后卫tzdata
捆绑包。
对于tzdata2018g
,命令如下所示:
java -jar tzupdater.jar -l https://web.cs.ucla.edu/~eggert/tz/release/2018g/tzdata2018g-rearguard.tar.gz
答案 3 :(得分:3)
这里有相同的问题,问题似乎仅在最新版本上。
使用
java -jar tzupdater.jar -l https://data.iana.org/time-zones/releases/tzdata2018d.tar.gz
(如果“ 2018d”足以满足您的需求)应该可以正常工作。
出于某种原因,此后,升级到最新的tzdata也可以正常工作(仅发出警告)。
答案 4 :(得分:1)
我遇到了同样的错误,然后使用以下Shell脚本修复了从IANA下载的文件,该脚本将文件中麻烦的行替换为先前版本的“ asia”文件,如所述@ lucas-basquerotto在他的帖子below中发表。我已经测试过,并且效果很好!
请下载TZUpdater 捆绑软件,解压缩tzupdater.jar并使用下载的jar文件的完整文件路径更新变量TZUPDATER_JAR,以成功运行脚本。
#!/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!"
以 update_jdk_tzdata.sh 的名称保存此脚本,并授予其执行权限:chmod +x update_jdk_tzdata.sh
并执行./update_jdk_tzdata.sh
(需要sudo才能更新JRE文件)
答案 5 :(得分:-1)
如果日语版本有问题,则yu可以使用另一个指向巴西的链接。 java -jar tzupdater.jar -l https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz
答案 6 :(得分:-1)
更新Java 8版本; tzupdater工具仅适用于Java 8 update 181。
答案 7 :(得分:-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