2010-03-10 5 views
5

Meine Zeitzone ist MEZ (Berlin).
Und während ich Tests Joda des Datetime bemerkt einige seltsame Dinge:ungerade ergebnisse in Joda DateTime für 01.04.1893

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 

A 6 Minuten 32 Sekunden in der Zeitzone in eine nicht vorhandene Zeit resultierende Verschiebung ??
Ich muss sagen, dass dies sehr unerwartet ist, da ich keine Zeitzoneninformationen angegeben habe und daher nicht mit dieser Art von Problem konfrontiert wurde.
Wenn im März 1893 CET (Berlin) nicht existiert - warum wählt new DateTime(1893, 3, 31, 0, 0, 0, 0) nicht die Zeitzone, die der angegebenen Zeit entspricht (d. H. 0 Minuten und 0 Sekunden)?

Was sind meine Optionen, um die richtige Zeit mit DateTime zu bekommen?

- BEARBEITEN -
Das Problem scheint die toDate(). Ich hatte es vor dem Stellen der Frage redigiert.
Joda selbst funktioniert eigentlich in Ordnung:

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

Es ist nur so, dass die Umstellung auf Datum Teil des Offset in Minuten und Sekunden bewegt.

Antwort

10

Wenn Sie keine Zeitzone angeben, verwendet Joda Time leider das System eins. Und ja, Berlin really did change damals (und um 6 Minuten und 32 Sekunden). Sie haben also eine Ortszeit angegeben, die nicht existiert.

Was meinen Sie mit "warum wählt [...] nicht die Zeitzone aus, die der angegebenen Zeit entspricht?" - Die Zeitzone beeinflusst, wie die lokale Zeit der UTC zugeordnet wird. In der Zeitzone haben Sie implizit angegeben (indem Sie Ihre System-Vorgabe auswählen), dass die Zeit nicht existierte; Keine UTC-Instant-Maps zu dieser lokalen Zeit. Es gibt eine beliebige Anzahl von Zeitzonen, die Karte dieser lokalen Zeit - wie würde Joda wissen, welche zu wählen?

Ich stimme zu, dass die Verwendung der System-Standard-Zeitzone ist eine schlechte Bewegung auf Joda (und wir behoben in Noda Time), aber der ganze Rest des Verhaltens ist absolut in Ordnung. (Noda Zeit hat eine spezifische Ausnahme für diese genau Situation es zu unterscheiden von in Werten vorbei, die mehr offensichtlich schlecht sind, aber es wir gehen.)

Wenn Sie in es bei allen keine Zeitzonen eingeben möchten dann sollten Sie stattdessen einen LocalDateTime verwenden.

+5

IOW: Es ist kein Fehler, es ist eine Funktion. Buchstäblich. –

+0

Danke für die Links. Ich sehe, dass CET vor diesem Datum nicht existierte. Und ich sehe, dass Joda tatsächlich das Datum korrekt erstellt. Mein Problem scheint mit der Konvertierung zu java.util.Date zu sein, die die Verschiebung nicht gut behandelt (siehe meine Bearbeitung). Aber das ist wahrscheinlich eher ein Problem mit Date als DateTime. – Stroboskop

0

Haben Sie versucht, das Element mit new DateTime(1893, 4, 1, 0, 0, 0, 0, DateTimeZone.UTC); zu Instanziieren?

+0

Ich möchte immer noch meine Zeitzoneninformationen behalten. – Stroboskop

Verwandte Themen