J'essaie de mettre à jour les informations de fuseau horaire de la machine virtuelle Java à l'aide de TZUpdater 2.2. .
> [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
Donc, je lance la commande ci-dessous:
> [root@local tzupdater-2.2.0]# Java -jar tzupdater.jar -l
Cependant, je reçois ce message d'erreur:
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
J'utilise https://www.iana.org/time-zones/repository/tzdata-latest.tar.gz comme source du paquet tzdata.
Edité - De plus, j'utilise Java Runtime Environment (version 1.8.0_66-b17) et OpenJDK Runtime Environment (version 1.8). .0_181-8u181-b13-1 ~ deb9u1-b13), pendant ce temps, j'ai le même problème signalé avec TZUpdater ou ZIUpdater
Quelqu'un peut-il m'aider à propos de ce problème? Tout commentaire sera apprécié.
Merci beaucoup.
Oui, les règles pour le Japon en 1948-1951 ont changé en 2018f de manière "intéressante": officiellement, le repli du Japon a eu lieu à 25 heures le samedi, au lieu de 1 heure le dimanche. Cela a perturbé le programme de mise à jour du fuseau horaire Java), ainsi que mon propre projet Noda Time.
Il y a maintenant un s'engager à éviter 25h00 dans le format "arrière-garde" - le format de l'arrière-garde est fondamentalement plus conservateur, évitant des choses comme le négatif de l'heure d'été de l'Irlande.
Je m'attendrais à une version 2018g dans un délai raisonnable afin d'inclure ce correctif. En supposant que l'outil tzupdater utilise l'arrière-garde de manière appropriée, je m'attendrais à ce que cela règle le problème. Si vous pouviez éventuellement attendre jusque-là, je le ferais. Sinon, utilisez le -l
drapeau sur tzupdater pour spécifier une source de données différente, par ex. pour 2018e: https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz
Puisque tzdata2018g est déjà publié avec le correctif fourni au format rearguard, veuillez utiliser l’arrière-garde tzdata
avec l’option -l.
Pour tzdata2018g
la commande ressemblera à ceci:Java -jar tzupdater.jar -l https://web.cs.ucla.edu/~eggert/tz/release/2018g/tzdata2018g-rearguard.tar.gz
Si vous devez utiliser la version 2018f mais pas le fuseau horaire Asie, vous pouvez l’utiliser à partir de 2018e et les autres fichiers à partir de 2018f.
J'ai créé le fichier tzdata2018f-01.tar.gz dans mon référentiel https://github.com/lucasbasquerotto/my-projects/tree/master/tz pour toute personne souhaitant éviter ces modifications manuelles.
Il existe un exemple d'utilisation de ziupdater lors de la création d'une image de menu fixe avec OpenJDK, mais si vous utilisez Oracle JDK, vous devriez pouvoir utiliser presque le même code pour utiliser tzupdater changer.
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
ou même
Java -jar tzupdater.jar -l https://github.com/lucasbasquerotto/my-projects/raw/master/tz/tzdata2018f-01.tar.gz
si vous ne voulez pas le télécharger manuellement.
Dans l'exemple de mon référentiel, il génère une image Docker, mais vous pouvez l'utiliser sans menu fixe, avec Java installé directement dans votre système d'exploitation.
J'ai exécuté le dernier exemple ci-dessus sur ma machine locale (qui utilise Oracle JDK) et le fuseau horaire a été corrigé avec succès:
public static void main(String[] args) {
System.out.println("Date: " + new Date()); // prints correctly now
}
Assurez-vous simplement que vous n'utilisez pas de bibliothèque tierce (telle que Joda Time) utilisant des données de fuseau horaire codées en dur dans son propre fichier jar (ou générez un fichier jar à partir de la source avec des données de fuseau horaire mises à jour, comme dans https://www.joda.org/joda-time/tz_update.html ).
Avait le même problème ici, et le problème semble être juste sur la dernière version.
En utilisant
Java -jar tzupdater.jar -l https://data.iana.org/time-zones/releases/tzdata2018d.tar.gz
(si "2018d" est suffisant pour vous) devrait fonctionner correctement.
Pour une raison quelconque, après cela, la mise à niveau vers la dernière version de tzdata a également fonctionné correctement (avec juste un avertissement).
Je rencontrais la même erreur, puis j’ai corrigé le fichier téléchargé à partir de IANA , à l’aide du script Shell suivant, qui remplace la ligne problématique dans le fichier par version précédente du fichier "asia", telle que décrite par @ lucas-basquerotto dans son message ci-dessous . J'ai testé et ça marche bien!
Téléchargez le paquet TZUpdater , extrayez le fichier tzupdater.jar et mettez à jour la variable TZUPDATER_JAR avec le chemin d'accès complet du fichier jar téléchargé afin d'exécuter le script avec succès.
#!/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!"
Enregistrez ce script sous le nom update_jdk_tzdata.sh et accordez-lui le droit d’exécuter: chmod +x update_jdk_tzdata.sh
et l'exécuter ./update_jdk_tzdata.sh
_ (il faut Sudo pour mettre à jour les fichiers JRE)