Es gibt zwei Probleme mit dem, was Sie gerade versuchen:
- Sie haben einen Tippfehler in der zweiten Codezeile, was bedeutet, dass Ihre Monate als Minuten geparst werden
- Wie bereits erwähnt, berücksichtigen Sie die Zeitzone nicht.
Um das erste Problem zu lösen, müssen Sie
ändernDate d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);
zu
Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);
Bei Datumsformaten wird zwischen Groß- und Kleinschreibung unterschieden. Sie haben versucht, den Monat als **m**inute statt als **M**onth zu analysieren. In dem von mir durchgeführten Test bedeutete dies, dass die Monate alle als Januar herauskamen, was ich auch in Ihrem Beispiel sehen kann. Außerdem stelle ich fest, dass Ihre erste Codezeile, der Formatierer (der korrekt eingerichtet ist) nicht verwendet wird.
Das zweite Problem ist ja, Java Date
s verhalten sich nicht so, wie Sie es erwarten. Sie MÜSSEN eine Zeitkomponente haben, auch wenn Sie sich nicht nur um das Datum kümmern. Außerdem müssen sie eine Zeitzone haben, da sie eine Zeit haben.
Möglicherweise haben Sie nicht die Wahl, in die übergeordnete Joda-Bibliothek zu wechseln. In diesem Fall gibt es Möglichkeiten, dies zu umgehen. Ich habe einen Test geschrieben, der dies demonstrieren soll:
@Test
public void shouldParseDateCorrectly() throws Exception {
// Given
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
// When
Date parsedDate = format.parse("21/08/2012");
// Then
Assert.assertThat(parsedDate.toString(), is("Tue Aug 21 02:00:00 CEST 2012"));
Assert.assertThat(parsedDate.toGMTString(), is("21 Aug 2012 00:00:00 GMT"));
}
Sie können also sehen, dass ich das richtige Format verwendet habe, aber auch die Zeitzone auf UTC eingestellt habe (also einen Offset von Null und keine Sommerzeit hat). Wenn Sie dann das Datum mit diesem Formatierer parsen, wird das Datum mit einer Uhrzeit ausgegeben, die Mitternacht in der UTC-Zeitzone ist. Da sich mein Computer in Europa befindet, wird beim Ausdrucken dieses Datums eine Zeit von 2 Uhr morgens angezeigt, da diese Zeitzone 2 Stunden vor UTC liegt. Aber wenn ich den veralteten toGMTString
verwende Methode kommt die Zeit als Null heraus.
Wenn Sie dieses Datum mit dem Java-Treiber in MongoDB speichern, speichert es das Datum, die Uhrzeit und die Zeitzone mit, auch wenn Sie sich nur um das Datum kümmern. Was Sie tun müssen, wenn Sie die Daten wieder vorlesen, ist, sich daran zu erinnern, dass sie in UTC sind, und die Zeitzone entsprechend einzustellen.
Alternativ können Sie sie in MongoDB speichern, ohne die Zeitzone zu ändern, vorausgesetzt, Sie lesen sie immer in derselben Zeitzone ein und schreiben sie aus. Dies ist jedoch mit unerwarteten Fehlern behaftet, wenn a) Zeiten über Mitternacht behandelt werden und b) die Sommerzeit beginnt (oder stoppt).
Oder verwenden Sie einfach Joda-Time .