Zeitzonen und Zeitverschiebungen ermitteln
Veröffentlicht: 10. Dez 2003 | Aktualisiert: 10. Nov 2004
Von Mathias Schiffer
Die Klassenbibliothek des .NET Frameworks bietet Funktionen zur Ermittlung von Informationen über Zeitzonen sowie die Umrechnung von Zeitangaben für andere Zeitzonen.
Im MSDN Quickie "Zeitzoneninformationen ermitteln" haben Sie erfahren, wie Sie unter Visual Basic 6.0 diverse Informationen über die aktuelle Zeitzone ermitteln können. Involviert waren neben einigen Strukturen und der API-Funktion GetTimeZoneInformation auch diverse Berechnungen, etwa für die Ermittlung der Wechseldaten zwischen Sommer- und Normalzeit aus kryptisch anmutenden Angaben (hierzu finden Sie weitere Informationen auch im MSDN Quickie "Wann ist der dritte Montag im März?").
Wie in so vielen Fällen haben auch hier die Entwickler des .NET Frameworks ähnliche Arbeiten hinter sich gebracht, deren Ergebnis sie uns in der Framework Class Library gekapselt über den Typ System.TimeZone zur Verfügung stellen. Dessen Eigenschaft CurrentTimeZone stellt ein TimeZone-Objekt mit Angaben über die auf der lokalen Maschine verwendeten Zeitzone zur Verfügung.
Dieses Objekt gibt sich so auskunftsfreudig, dass Sie alle Sie interessierenden Informationen eigentlich nur noch abholen müssen.
So informiert Sie die Funktion IsDaylightSavingsTime, ob ein bestimmter Zeitpunkt im Sommerzeitbereich liegt - möchten Sie wissen, ob aktuell Sommer- oder Normalzeit ist, verwenden Sie mithilfe von Now einfach die aktuelle Systemzeit.
Die Eigenschaften DaylightName und StandardName informieren Sie über die Klartextnamen der Zeitbereiche. In unseren Breitengraden etwa ergibt sich "Westeuropäische Sommerzeit" und "Westeuropäische Normalzeit". Weist eine Zeitzone keine Sommerzeit auf, so bleibt die Angabe für DaylightName ein leerer String.
Möchten Sie erfahren, wann eine vorhandene Sommerzeit beginnt und wann sie endet, so erfahren Sie dies vom .NET Framework nicht mit der allgemeinen Regelung (hierzulande etwa als letzten Sonntag im März für den Beginn und letzten Sonntag im Oktober für das Ende der Sommerzeit): Die Funktion GetDaylightChanges ermittelt stattdessen auf Basis eines übergebenen Jahres die konkreten, für das angefragte Jahr gültigen Daten und gibt diese als DaylightTime-Objekt zurück, dessen Eigenschaften Start und End Sie die konkreten Daten entnehmen können. Weiterhin liefert Ihnen das DaylightTime-Objekt über die Eigenschaft Delta auch den Zeitunterschied zwischen Sommer- und Normalzeit - den Zeitraum also, um den die Uhrzeit bei Wechsel verändert wird.
Ebenfalls kümmert sich die TimeZone-Klasse um die Beziehungen zwischen den Zeitzonen und der Einheitszeit UTC ("Universally Coordinated Time", bis 1986 "Greenwich Mean Time" - GMT - genannt). Hierfür steht die Funktion GetUtcOffset zur Verfügung. Auch einer Umrechnung von Lokalzeit in UTC-Zeit steht nichts im Wege: Die Funktion ToUniversalTime rechnet ein Datum von Lokalzeit in UTC-Zeit um. Das Gegenstück hierzu finden Sie in der Funktion ToLocalTime.
Der folgende Beispielcode zeigt mit Ausgabe der Ergebnisse in das Output-Fenster Ihrer Visual Studio .NET Entwicklungsumgebung (oder in das Konsolenfenster einer Konsolenanwendung), wie sie dafür vorgehen.
' Beispielcode für Zeitzoneninformationen unter VB.NET ' ' Einmalig Zeitzonen-Informationen abholen - alle weiteren ' Codezeilen dienen ausschließlich der Auswertung dieser ' Informationen! Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone ' Ausgabe des Namens der aktuell gültigen Zeitzone - ' beinhaltet die Abfrage, ob aktuell Sommerzeit ist: Console.WriteLine("Name der aktuellen Zeitzone: {0}", _ IIf(tz.IsDaylightSavingTime(Now), _ tz.DaylightName, tz.StandardName)) ' Ausgabe der aktuellen Zeitverschiebung der Zeitzone: Console.WriteLine("Die aktuelle Zeitverschiebung gegenüber " _ & "gegenüber UTC-Zeit beträgt {0} Minuten.", _ tz.GetUtcOffset(Now).TotalMinutes.ToString) ' Ausgabe des Namens der Standardzeit: Console.WriteLine("Name der Normalzeit: {0}", tz.StandardName) ' Besitzt die aktuelle Zeitzone eine Sommerzeitzone? If Len(tz.DaylightName) = 0 Then Console.WriteLine ("Diese Zeitzone verwendet keine Sommerzeit.") Else ' Den Namen der Sommerzeitzone ausgeben: Console.WriteLine("Name der Sommerzeit: {0}", tz.DaylightName) ' Start und Enddatum der Sommerzeit ermitteln Dim dtStart, dtEnd As DateTime dtStart = tz.GetDaylightChanges(Year(Now)).Start dtEnd = tz.GetDaylightChanges(Year(Now)).End ' Ergebnis ausgeben Console.WriteLine("Die {0} " _ & "beginnt in diesem Jahr am {1} um {2} Uhr " _ & "und endet am {3} um {4} Uhr.", _ tz.DaylightName, _ dtStart.ToShortDateString, dtStart.ToShortTimeString, _ dtEnd.ToShortDateString, dtEnd.ToShortTimeString) ' Die jeweiligen Zeitverschiebungen gegen UTC-Zeit ermitteln: Console.WriteLine("Zeitverschiebung der Normalzeit " _ & "gegenüber UTC-Zeit: {0} Minuten.", _ tz.GetUtcOffset(dtStart).TotalMinutes.ToString) Console.WriteLine("Zeitverschiebung der Sommerzeit " _ & "gegenüber UTC-Zeit: {0} Minuten.", _ tz.GetUtcOffset(dtStart.AddDays(1)).TotalMinutes.ToString) ' Ermitteln der Unterschieds zwischen Sommer- und Winterzeit: Console.WriteLine("Der Unterschied zwischen Normalzeit und Sommerzeit " _ & "beträgt {0} Minuten.", _ tz.GetDaylightChanges(Year(Now)).Delta.TotalMinutes.ToString) End If ' Umrechnung einer Lokalzeit in UTC-Zeit Dim dt As DateTime = Now ' Aktuelle Lokalzeit Dim dtUtc As DateTime ' Berechnete UTC-Zeit dtUtc = tz.ToUniversalTime(dt) ' Berechnung der UTC-Zeit Console.WriteLine("Aktuelle UTC-Zeit: {0}", dtUtc.ToString) ' Umrechnung einer UTC-Zeit in Lokalzeit: dt = tz.ToLocalTime(dtUtc) ' Berechnung der Lokalzeit Console.WriteLine("Aktuelle Lokalzeit: {0}", dt.ToString)