Winterzeit und java.util.Calendar - unerwartetes Verhalten

Lebensraum:

Die Zeitumstellung wurde eigentlich zum Sparen von Strom eingeführt - Bringt aber nichts.

Der java.util.Calendar wurde zur Verwaltung der Zeit eingeführt - Bringts aber auch nicht.

Was passiert nun wenn man beides zusammenfügt? Richtig - Das macht es nicht besser!

  • Initialisierung des Calendar - Noch ist alles gut.

GregorianCalendar cal;
cal = (GregorianCalendar) Calendar.getInstance();
cal.setFirstDayOfWeek(Calendar.MONDAY);

  • 1 != 1 - Eine Stunde ist nicht eine Stunde

cal.clear();
// Am 31.10.2010 erfolgte die Umstellung von Sommer- auf Winterzeit
cal.set(2010, Calendar.OCTOBER, 31, 1, 0);
long t1 = cal.getTimeInMillis();
cal.set(2010, Calendar.OCTOBER, 31, 2, 0);
long t2 = cal.getTimeInMillis();
cal.set(2010, Calendar.OCTOBER, 31, 3, 0);
long t3 = cal.getTimeInMillis();
System.out.println(t2 - t1); // Ergebnis 7200000 => 2h
System.out.println(t3 - t2); // Ergebnis 3600000 => 1h

Setzt man die Stunde "zwei" im Kalender ist das immer die B-Stunde, für die A-Stunde gibt es keine direkte Eingabemöglichkeit.

  • Die A-Stunde setzen - Intuitiv ist anders

cal.clear();
cal.set(2010, Calendar.OCTOBER, 31, 1, 00);
cal.add(Calendar.HOUR,1);
long t4 = cal.getTimeInMillis();
System.out.println(t2 - t4 ); // Ergebnis 3600000 => 1h

Durch das Addieren entsprechen die Millisekunden nun der A-Stunde.

  • Arbeiten mit dem Calender - aber ohne A-Stunde

cal.set(Calendar.MINUTE, 0);
long t5 =  cal.getTimeInMillis();
System.out.println(t2 - t5 ); // Ergebnis 0 => wir erhalten die Millis der B-Stunde

Durch den Aufruf eines Setter auf java.util.Calendar (es ist egal welches Feld befüllt wird) verschwindet die A-Stunde und man bekommt die B-Stunde geliefert. Möchte man mit dem Calendar in Bezug auf die Zeitumstellung arbeiten, sollte man dieses Verhalten auf jeden Fall im Hinterkopf behalten.

Da der java.util.Calendar neben dem eben gezeigten Unzulänglichkeiten auch noch weitere Probleme hat, möchte ich auf zwei Alternativen verweisen:

  • Joda-Time - Eine Mächtige Bibliothek mit vielfältigen Möglichkeiten. Für Projekte mit intensiver und genauer Verwendung der "Zeit" zu empfehlen
  • date4j - Eine einfache Implementierung von Datum und Zeit. Das API besteht aus lediglich einer öffentlichen Klasse. Für die meisten Fälle ausreichend.