Ошибка обновления tzdata 2018f (выпущена 2018-10-18) с помощью tzupdater-2.2.0
Я пытаюсь обновить информацию о часовом поясе JVM с помощью TZUpdater 2.2.0.
> [[email protected] 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
Итак, я запускаю следующую команду:
> [[email protected] 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 Runtime Environment (build 1.8.0_66-b17), и среду выполнения OpenJDK (сборка 1.8.0_181-8u181-b13-1 ~ deb9u1-b13), между тем у меня одинаковые сообщила о проблеме с использованием TZUpdater или ZIUpdater
Может ли кто-нибудь помочь мне в этом вопросе? Любой комментарий будет оценен.
Большое спасибо.
Ответы
Ответ 1
Да, правила для Японии в 1948-1951 годах изменились в 2018 году в "интересном" виде: официально, Япония отступила в 25:00 в субботу, а не в 01:00 в воскресенье. Это путало обновление часового пояса Java, а также мой собственный проект Noda Time.
Теперь есть фиксация, чтобы избежать 25:00 в формате "арьергарда" - формат арьергарда в основном более консервативен, избегая таких вещей, как отрицательный DST в Ирландии.
Я ожидал бы выпуск 2018г в какой-то момент достаточно быстро, включив это исправление. Предполагая, что инструмент tzupdater правильно использует арьергард, я бы ожидал, что это разобратся. Если вы можете подождать до тех пор, я сделаю это. В противном случае используйте флаг -l
на tzupdater, чтобы указать другой источник данных, например, для 2018e: https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz
Ответ 2
Если вам нужно использовать версию 2018f, но не часовой пояс Asia, вы можете использовать ее с 2018 года и другие файлы с 2018f.
Я создал файл tzdata2018f-01.tar.gz в моем репозитории https://github.com/lucasbasquerotto/my-projects/tree/master/tz для тех, кто хочет избежать этих ручных изменений.
Пример использования ziupdater при создании образа докеров с OpenJDK, но если вы используете 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, но вы можете использовать его без докеров, а Java установлен непосредственно в вашей ОС.
Я выполнил последний пример выше на моей локальной машине (которая использует Oracle JDK), и часовой пояс был исправлен успешно:
public static void main(String[] args) {
System.out.println("Date: " + new Date()); // prints correctly now
}
Просто убедитесь, что вы не используете стороннюю библиотеку (например, Joda Time), которая использует данные часового пояса, жестко закодированные в своей собственной банке (или генерирует банку из источника с обновленными данными о часовом поясе, например, в https://www.joda.org/joda-time/tz_update.html).
Ответ 3
Здесь была одна и та же проблема, и проблема, похоже, только в последней версии.
С помощью
java -jar tzupdater.jar -l https://data.iana.org/time-zones/releases/tzdata2018d.tar.gz
(если для вас достаточно "2018d"), он должен работать нормально.
По какой-то причине после этого обновление до последней tzdata также отлично работало (только с предупреждением).
Ответ 4
Я столкнулся с той же ошибкой, затем исправил загруженный файл из IANA, используя следующий сценарий оболочки, который заменяет проблемную строку в файле предыдущей версией файла "asia", как описано @lucas-basquerotto в его пост ниже. Я проверил, и это отлично работает!
Пожалуйста, загрузите пакет TZUpdater, распакуйте tzupdater.jar и обновите переменную TZUPDATER_JAR, указав полный путь к загруженному файлу 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
(для обновления файлов JRE требуется sudo)
Ответ 5
Поскольку tzdata2018g уже выпущен с исправлением, представленным в формате артефактов, используйте пакет regguard tzdata
с параметром -l.
Для tzdata2018g
команда будет выглядеть так:
java -jar tzupdater.jar -l https://web.cs.ucla.edu/~eggert/tz/release/2018g/tzdata2018g-rearguard.tar.gz
Ответ 6
Если у вас проблемы с японской версией, yu может использовать другую ссылку для Бразилии. java -jar tzupdater.jar -l https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz
Ответ 7
Обновите версию Java 8; инструмент tzupdater работает только в Java 8 update 181.
Ответ 8
Используйте следующие команды:
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