5.7Zeitzonen in Java *
Eine Zeitzone ist ein Gebiet mit gleicher Zeitrechnung. Im Allgemeinen ist sie an einem geografischen Längenkreis ausgerichtet, und die lokale Zeit einer Zeitzone unterscheidet sich im Allgemeinen um eine ganze Stundenzahl von der Weltzeit UTC. Für Zeitzonen östlich des Nullmeridians ist die Differenz der Ortszeit minus der Weltzeit positiv, für westliche Zeitzonen negativ. Deutschland liegt in der Zeitzone 1, und die Standardzeit heißt Mitteleuropäische Zeit (MEZ) oder auch CET (Central European Time).
Da die UTC-Zeit keinen Wechsel zwischen Sommer- und Winterzeit kennt, ist mitunter im Sommer zu unserer Zeit eine weitere Stunde zu addieren. Sommerzeiten (engl. daylight saving time) haben keine astronomische Grundlage.
5.7.1Zeitzonen durch die Klasse TimeZone repräsentieren
Ein Exemplar der Klasse TimeZone repräsentiert eine Zeitzone inklusive Zeitverschiebung. Mit der statischen Methode getDefault() lässt sich immer ein Zeitzonen-Objekt passend zu den lokalen Gegebenheiten ermitteln; die explizitere Methode getTimeZone() erwartet einen String, die so genannte Zeitzonen-ID, aus der sie das TimeZone-Objekt aufbaut.
[zB]Beispiel
Hole die Zeitzone für Deutschland:
System.out.println( timezone.getDisplayName() ); // Mitteleuropäische Zeit
implements Serializable, Cloneable
static TimeZone getDefault()
Gibt die Zeitzone für die aktuelle (geografische) Umgebung zurück. Diese Zeitzone muss nicht unbedingt die deutsche Sommer-/Winterzeit kennen.static TimeZone getTimeZone(String ID)
Liefert die Zeitzone für eine gegebene Abkürzung. So liefert TimeZone.getTimeZone("CET") unsere Zeitzone, in der auch die Sommer-/Winterzeit voreingestellt ist.static String[] getAvailableIDs()
Liefert alle der Bibliothek bekannten Abkürzungen für Zeitzonen. Die Liste ist über 600 Einträge lang und beginnt mit »ACT«, geht über »CET«, »Europe/Berlin« bis »Zulu«.static String[] getAvailableIDs(int rawOffset)
Liefert die Abkürzungen für Zeitzonen in einer gegebenen Zeitzone.
Merkwürdigkeiten
Fast immer läuft die Uhr vorwärts und nur in ganz seltenen Fällen rückwärts. Eine Ausnahme betraf Shanghai am 1.1.1928 um 00:00 Uhr, an dem die Uhr auf den 31.12.1927 23:54:08 zurückgestellt wurde, also um fast 6 Minuten. Diese Eigenschaft ist abhängig von der Zeitzone und taucht so nur in der Zeitzone »Asia/Shanghai« auf.
5.7.2SimpleTimeZone
SimpleTimeZone ist eine konkrete Unterklasse der abstrakten Klasse TimeZone. Um ein Exemplar für die mitteleuropäische Zeit zu konfigurieren, initialisieren wir das Objekt mit der gewünschten Zeitverschiebung gegenüber der UTC. Zusätzlich wird ein Kürzel für die Zeitzone als String übergeben. Danach stellen wir noch passend die Regeln für Anfang und Ende der Sommerzeit ein. Der Wechsel erfolgt am letzten Sonntag im März bzw. Oktober jeweils um 2 Uhr nachts.
[zB]Beispiel
Eine SimpleTimeZone für Deutschland:
mez.setStartRule( Calendar.MARCH, -1, Calendar.SUNDAY, 2*60*60*1000 );
mez.setEndRule( Calendar.OCTOBER, -1, Calendar.SUNDAY, 2*60*60*1000 );
Wenn wir ein Calendar-Objekt mit der mitteleuropäischen Zeit als Grundlage versehen wollen, schreiben wir:
Hinweis: Das Beispiel zeigt die Möglichkeit der SimpleTimeZone-Klasse; für ein deutsches Zeitzonen-Objekt ist TimeZone.getTimeZone("CET") kürzer.
Abbildung 5.1SimpleTimeZone ist eine Unterklasse von TimeZone.
Da Java die CET-Zeitzone und alle anderen Zeitzonen korrekt beschreibt, müssen wir in der Regel nie ein eigenes TimeZone-Objekt aufbauen. Die Daten aller wichtigen Zeitzonen sind in Java hinterlegt, und Änderungen werden laufend übernommen. Java greift hier auf die Zeitzonen-Daten der Olsen-Datenbank (auch tz database genannt) zurück.
extends TimeZone
SimpleTimeZone(int rawOffset, String ID)
SimpleTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int endMonth, int endDay, int endDayOfWeek, int endTime)
SimpleTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int endMonth, int endDay, int endDayOfWeek, int endTime, int dstSavings)
SimpleTimeZone(int rawOffset, String ID, int startMonth, int startDay, int startDayOfWeek, int startTime, int startTimeMode, int endMonth, int endDay, int endDayOfWeek, int endTime, int endTimeMode, int dstSavings)
Erzeugt mit unterschiedlichen Belegungen ein Zeitzonen-Objekt.
5.7.3Methoden von TimeZone
Die ersten vorgestellten Methoden der TimeZone-Klasse waren alle statisch, also nicht an Eigenschaften eines konkreten Zeitzonen-Objekts gebunden. Die TimeZone-Klasse bietet eine Reihe von Methoden (einige sind abstrakt), und die Unterklasse SimpleTimeZone fügt noch Methoden hinzu. Eine Gruppe von überladenen getDisplayName()-Methoden liefert String-Repräsentationen der Zeitzone, damit sie zum Beispiel in grafischen Dialogen angezeigt werden kann. Eine andere Gruppe von Gettern liefert zum Beispiel eine Zeitzonen-ID oder den UTC-Offset.
Sommer oder Winterzeit?
Die Methode inDaylightTime(Date) in TimeZone liefert true, wenn das Datum vom Date-Objekt in der Sommerzeit liegt (engl. daylight saving time). Ob die Zeitzone überhaupt Sommer-/Winterzeit kennt, liefert die Methode observesDaylightTime().
[zB]Beispiel
Ist der 1. Januar oder der 1. Juli 2012 in der Sommerzeit?
Calendar cal1 = new GregorianCalendar( 2012, Calendar.JANUARY, 1 );
System.out.println( mez.inDaylightTime( cal1.getTime() ) ); // false
Calendar cal2 = new GregorianCalendar( 2012, Calendar.JULY, 1 );
System.out.println( mez.inDaylightTime( cal2.getTime() ) ); // true
Die Zeitzone sollte besser explizit gesetzt werden, denn TimeZone.getDefault() muss nicht funktionieren. Das GregorianCalendar-Objekt ist standardmäßig auch mit der Default-Zeitzone belegt, sodass cal1.getTimeZone().inDaylightTime(cal1.getTime()) nicht zwingend funktioniert.
[zB]Beispiel
Die Default-Zeitzone muss nicht zwingend die Sommer-/Winterzeit kennen:
System.out.println( tz.observesDaylightTime() ); // false
TimeZone cet = TimeZone.getTimeZone( "CET" );
System.out.println( cet.observesDaylightTime() ); // true