Comment gérer jodatime Illégale instant en raison du décalage de fuseau horaire de transition
Je veux mettre en place joda DateTime
à aujourd'hui, à 2 heures du matin (voir l'exemple de code ci-dessous). Mais je suis de cette exception:
Exception in thread "main" org.joda.time.IllegalFieldValueException: Value 2 for hourOfDay is not supported: Illegal instant due to time zone offset transition: 2011-03-27T02:52:05.239 (Europe/Prague)
at org.joda.time.chrono.ZonedChronology$ZonedDateTimeField.set(ZonedChronology.java:469)
at org.joda.time.MutableDateTime.setHourOfDay(MutableDateTime.java:702)
Quelle est la manière correcte de la poignée de l'exception ci-dessus ou pour créer une DateTime
à une heure donnée de la journée?
Exemple de code:
MutableDateTime now = new MutableDateTime();
now.setHourOfDay(2);
now.setMinuteOfHour(0);
now.setSecondOfMinute(0);
now.setMillisOfSecond(0);
DateTime myDate = now.toDateTime();
Grâce.
- pertinentes: joda-interest.219941.n2.nabble.com/...
- Il semble toujours à moi que ces questions sont beaucoup plus compliquées qu'elles ne devraient l'être. En interne, Joda représente instants comme POSIX-style UTC entiers longs. Depuis ce temps, le format est un simple nombre cumulatif de millisecondes, et n'est jamais ajusté pour l'heure d'été, l'utilise en interne pour datetimes toujours dispense de l'heure d'été des problèmes de conversion. Le problème avec l'heure d'été est amorti sur la conversion des fonctions de conversion de l'instant en local formaté fuseau horaire courant des cordes quand il a besoin d'être affiché à l'utilisateur. Cette approche semble beaucoup plus simple pour moi.
- regarde ma réponse stackoverflow.com/questions/17665921/...
Vous devez vous connecter pour publier un commentaire.
Il semble que vous essayez d'obtenir à partir d'un local spécifique de temps pour un
DateTime
exemple et que vous voulez être solide pour faire face à l'heure d'été. Essayez ceci... (remarque je suis en US/Eastern, de sorte que notre date de transition a été 13 Mar 11; j'ai eu à trouver la bonne date pour obtenir de l'exception que vous avez obtenu aujourd'hui. Mis à jour mon code ci-dessous pour HEC, qui fait la transition d'aujourd'hui). L'insight est ici que Joda fournitLocalDateTime
pour vous permettre de raisonner sur un local de mur-réglage de l'horloge et de savoir si c'est légal dans votre fuseau horaire ou pas. Dans ce cas, je viens de rajouter une heure si le temps n'existe pas (votre demande de décider si c'est la bonne politique.)Ce code produit:
CET commutateurs à l'heure d'été (heure d'été), le dernier dimanche de Mars, qui se trouve être aujourd'hui. Le temps est passé de 1:59:59 à 3:00:00 – il n'y a pas 2, donc l'exception.
Vous devez utiliser UTC au lieu de l'heure locale pour éviter ce genre de temps question de la zone.
Je pense que beaucoup de temps, vous voulez joda réparer automatiquement pour vous. Vous n'aurez pas souvent que vous connaissez la bonne façon de fixer un écart de date en raison de la taille de l'écart dépend de la zone et de l'année (même si bien sûr il est généralement d'une heure).
Un exemple de ceci est que si vous analysez un horodatage qui provient d'une source que vous ne contrôlez pas, par exemple, le réseau. Si l'expéditeur de l'horodatage a plus à jour des fichiers de zone, ce qui pourrait arriver. (Si vous avez dépassées les fichiers de zone, vous êtes assez bien foutue).
Voici une façon de faire, qui, est, est un peu plus compliqué. Je l'ai fait travailler dans joda 1.6 ainsi que 2.x, puisque nous arrive d'être coincé sur 1.6 dans notre environnement.
Si vous êtes la construction d'une date à partir de certains autres intrants, comme dans votre question, vous pouvez commencer avec une date UTC ou un
LocalDate
comme suggéré ci-dessus, et à s'adapter, ce afin de corriger automatiquement votre décalage. De la sauce spéciale est enDateTimeZone.convertLocalToUTC
Dangereux:
Sûre:
J'ai testé cela dans l'est et de l'ouest hémisphères ainsi que l'Île de Lord Howe zone, qui arrive à avoir une demi-heure de l'heure d'été.
Il serait agréable si joda formateurs seraient en faveur d'un setStrict(booléen) qui demanderait de prendre soin de cela pour vous...
Si vous avez besoin d'analyser la date de chaîne:
A fonctionné parfaitement pour moi. Peut-être que quelqu'un en aura besoin.
Mise à jour jodatime 2.1 et l'utilisation
LocalDate.parse()
: