5 Stimmen

Seltsame Ergebnisse in Joda DateTime für 01.04.1893

Meine Zeitzone ist CET (Berlin).
Und beim Testen von Jodas DateTime sind mir einige seltsame Dinge aufgefallen:

new DateTime(1893, 4, 1, 0, 0, 0, 0);
=>  java.lang.IllegalArgumentException: Illegal instant due to time zone offset transition: 

new DateTime(1893, 3, 31, 0, 0, 0, 0).toDate();
=>  Fri Mar 31 00:06:32 CET 1893

Eine Verschiebung von 6 Minuten und 32 Sekunden in der Zeitzone, die zu einer nicht existierenden Zeit führt?
Ich muss sagen, dass dies sehr unerwartet ist, da ich keine Zeitzoneninformationen angegeben habe und daher nicht erwartet habe, dass ich auf diese Art von Problem stoße.
Wenn es im März 1893 die CET (Berlin) nicht gibt - warum gibt es dann nicht new DateTime(1893, 3, 31, 0, 0, 0, 0) die Zeitzone auswählen, die der von mir angegebenen Zeit entspricht (d. h. 0 Minuten und 0 Sekunden)?

Welche Möglichkeiten habe ich, um die richtige Zeit mit DateTime zu erhalten?

-- EDIT --
Das Problem scheint die Funktion toDate() zu sein. Ich hatte es vor dem Posten der Frage heraus bearbeitet.
Joda selbst funktioniert eigentlich gut:

new DateTime(1893, 3, 31, 0, 0, 0, 0);
=>  1893-01-01T00:00:00.000+00:53:28

Bei der Konvertierung in Datum wird ein Teil des Offsets in die Minuten und Sekunden verschoben.

10voto

Jon Skeet Punkte 1325502

Wenn Sie keine Zeitzone angeben, verwendet Joda Time leider die Systemzeit. Und ja, Berlin wirklich hat ändern zu diesem Zeitpunkt (und um 6 Minuten und 32 Sekunden). Sie haben also eine Ortszeit angegeben, die es nicht gab.

Was meinen Sie mit "warum wählt [...] nicht die Zeitzone, die mit der von mir angegebenen Zeit übereinstimmt"? - Die Zeitzone wirkt sich darauf aus, wie die Ortszeit auf UTC abgebildet wird. In der Zeitzone, die Sie implizit (indem Sie die Standardeinstellung Ihres Systems wählen), existiert diese Zeit nicht; kein UTC-Sofortwert entspricht dieser Ortszeit. Es gibt eine beliebige Anzahl von Zeitzonen, die würde Wie sollte Joda wissen, welchen er wählen sollte?

Ich stimme zu, dass die Verwendung der Standardzeitzone des Systems ein schlechter Zug von Joda ist (den wir in Noda Zeit ), aber der Rest des Verhaltens ist absolut in Ordnung. (Noda Time hat eine spezielle Ausnahme für genau diese Situation, um sie von der Übergabe von Werten zu unterscheiden, die offensichtlicher schlecht sind, aber so ist es eben).

Wenn Sie nicht wollen, dass Zeitzonen eine Rolle spielen überhaupt dann sollten Sie eine LocalDateTime stattdessen.

0voto

Jack Punkte 128223

Haben Sie versucht, den Gegenstand mit new DateTime(1893, 4, 1, 0, 0, 0, 0, DateTimeZone.UTC); ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X