Ошибка обновления tzdata 2018f (выпущено 2018-10-18) с помощью tzupdater-2.2.0 - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь обновить информацию о часовом поясе JVM, используя TZUpdater 2.2.0 .

> [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 Runtime Environment (сборка 1.8.0_66-b17) и OpenJDK Runtime Environment (сборка 1.8.0_181-8u181-b13-1 ~ deb9u1-b13), тем временем яу вас есть проблемы с использованием TZUpdater или ZIUpdater

Может кто-нибудь помочь мне решить эту проблему?Любой комментарий будет оценен.

Большое спасибо.

Ответы [ 8 ]

0 голосов
/ 23 ноября 2018

Так как tzdata2018g уже выпущен с исправлением, предоставленным в формате тыла, используйте комплект tzdata тыла с опцией -l.

Для tzdata2018g команда будет выглядеть какэто:
java -jar tzupdater.jar -l https://web.cs.ucla.edu/~eggert/tz/release/2018g/tzdata2018g-rearguard.tar.gz

0 голосов
/ 23 октября 2018

Я столкнулся с той же ошибкой, затем исправил загруженный файл из 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 (для этого требуетсяsudo для обновления файлов JRE)

0 голосов
/ 23 октября 2018

Если вам нужно использовать версию 2018f, но не часовой пояс Азии, вы можете использовать его с 2018e и другие файлы с 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)Время), который использует часовой поясжестко закодированный в своем собственном банке (или сгенерировать банку из источника с обновленными данными часового пояса, как в https://www.joda.org/joda-time/tz_update.html).

0 голосов
/ 22 октября 2018

Используйте эти команды:

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
0 голосов
/ 22 октября 2018

Обновите вашу версию Java 8;инструмент tzupdater работает только в Java 8, обновление 181.

0 голосов
/ 22 октября 2018

Если у вас проблемы с японской версией, вы можете воспользоваться другой ссылкой для Бразилии.java -jar tzupdater.jar -l https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz

0 голосов
/ 22 октября 2018

Была такая же проблема здесь, и проблема, кажется, только в последней версии.

Использование

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

(если вам достаточно «2018d») должно работать нормально.

Почему-то после этого обновление до последней версии tzdata также работало нормально (только с предупреждением).

0 голосов
/ 22 октября 2018

Да, правила для Японии в 1948-1951 годах изменились в 2018 году "интересным" образом: официально падение Японии произошло в 25:00 в субботу, а не в 01:00 в воскресенье.Это сбило с толку средство обновления часового пояса Java, а также мой собственный проект Noda Time.

Теперь есть коммит, чтобы избежать 25:00 в формате «тыла» - формат тыла в основномболее консервативным, избегая таких вещей, как отрицательный DST в Ирландии.

Я бы ожидал, что выпуск 2018g в какой-то момент довольно скоро будет включать это исправление.Предполагая, что инструмент tzupdater использует арьергард надлежащим образом, я бы ожидал, что все уладится.Если вы можете подождать до тех пор, я бы так и сделал.В противном случае используйте флаг -l на tzupdater, чтобы указать другой источник данных, например, для 2018e: https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...