Auswählen zwischen "DateTime", "DateTimeOffset" und "TimeZoneInfo"
Aktualisiert: November 2007
.NET Framework-Anwendungen, die Datums- und Uhrzeitinformationen verwenden, sind sehr vielfältig und können diese Informationen in verschiedener Hinsicht nutzen. Die allgemeinen Verwendungsmöglichkeiten von Datums- und Uhrzeitinformationen umfassen z. B. folgende:
Zur alleinigen Wiedergabe eines Datums, wenn Uhrzeitinformationen nicht von Bedeutung sind.
Zur alleinigen Wiedergabe einer Uhrzeit, wenn Datumsinformationen nicht von Bedeutung sind.
Zur Wiedergabe abstrakter Datums- und Uhrzeitinformationen, die nicht mit einer bestimmten Uhrzeit und einem bestimmten Ort verknüpft sind (beispielsweise öffnen die meisten Geschäfte einer internationalen Kette um 9:00 Uhr morgens).
Zum Abrufen von Datums- und Uhrzeitinformationen aus Quellen außerhalb von .NET Framework, in denen Datums- und Uhrzeitinformationen normalerweise in einem einfachen Datentyp gespeichert werden.
Zur eindeutigen Identifizierung eines bestimmten Zeitpunkts. Einige Anwendungen erfordern, dass Datums- und Uhrzeitinformationen nur auf dem Hostsystem eindeutig sind, andere hingegen, dass sie systemübergreifend eindeutig sind (d. h. ein auf einem System serialisiertes Datum kann aussagekräftig deserialisiert und auf einem anderen System an einem beliebigen Ort verwendet werden).
Zum Beibehalten mehrerer zusammenhängender Zeiten (z. B. die lokale Zeit des Anfordernden und die Empfangszeit einer Webanforderung auf dem Server).
Zum Durchführen arithmetischer Datums- und Uhrzeitoperationen, die in der eindeutigen Identifizierung eines bestimmten Zeitpunkts resultieren können.
.NET Framework beinhaltet die Typen DateTime, DateTimeOffset und TimeZoneInfo, die zum Erstellen von Anwendungen verwendet werden können, die Datums- und Uhrzeitinformationen unterstützen.
Hinweis: |
---|
Ein vierter Typ, TimeZone, wird in diesem Thema nicht behandelt, da seine Funktionalität nahezu vollständig in der TimeZoneInfo-Klasse enthalten ist. Nach Möglichkeit sollten Entwickler die TimeZoneInfo-Klasse anstelle der TimeZone-Klasse verwenden. |
Die "DateTime"-Struktur
Ein DateTime-Wert definiert ein bestimmtes Datum und eine bestimmte Uhrzeit. .NET Framework verfügt ab Version 2.0 über eine Kind-Eigenschaft, die eingeschränkte Informationen über die Zeitzone bereitstellt, zu der das Datum und die Uhrzeit gehören. Der DateTimeKind-Wert, der von der Kind-Eigenschaft zurückgegeben wird, gibt an, ob der DateTime-Wert die lokale Zeit (DateTimeKind.Local), die koordinierte Weltzeit bzw. UTC-Zeit (DateTimeKind.Utc) oder eine nicht spezifizierte Zeit (DateTimeKind.Unspecified) darstellt.
Die DateTime-Struktur eignet sich für Anwendungen, die Folgendes unterstützen:
Arbeiten nur mit Datumswerten
Arbeiten nur mit Uhrzeitwerten
Arbeiten mit abstrakten Datums- und Uhrzeitwerten
Abrufen von Datums- und Uhrzeitinformationen aus Quellen außerhalb von .NET Framework, z. B. SQL-Datenbanken. Diese Quellen speichern Datums- und Uhrzeitinformationen normalerweise in einem einfachen Format, das mit der DateTime-Struktur kompatibel ist.
Durchführen arithmetischer Datums- und Uhrzeitoperationen, die in erster Linie allgemeine Ergebnisse liefern sollen. Beispielsweise ist es beim Addieren von sechs Monaten zu einem bestimmten Datum und einer bestimmten Uhrzeit häufig nicht von Bedeutung, ob das Ergebnis im Hinblick auf die Sommerzeit angepasst wurde.
Sofern ein bestimmter DateTime-Wert nicht die koordinierte Weltzeit darstellt, ist dieser Wert oft mehrdeutig oder in seiner Portabilität eingeschränkt. Wenn z. B. ein DateTime-Wert die lokale Zeit darstellt, ist er innerhalb dieser lokalen Zeitzone portabel (wenn der Wert also auf einem anderen System in der gleichen Zeitzone deserialisiert wird, kann er weiterhin zur eindeutigen Identifizierung eines bestimmten Zeitpunkts verwendet werden). Außerhalb der lokalen Zeitzone kann dieser DateTime-Wert mehrere Interpretationen zulassen. Wenn die Kind-Eigenschaft des Werts DateTimeKind.Unspecified lautet, ist er in seiner Portabilität noch eingeschränkter, da er nun innerhalb der gleichen Zeitzone und möglicherweise sogar auf dem gleichen System, auf dem er serialisiert wurde, mehrdeutig ist. Nur wenn ein DateTime-Wert die koordinierte Weltzeit darstellt, kann er zur eindeutigen Identifizierung eines bestimmten Zeitpunkts verwendet werden, und zwar unabhängig vom System oder der Zeitzone, in der er verwendet wird.
Wichtiger Hinweis: |
---|
Beim Speichern oder Freigeben von DateTime-Daten empfiehlt es sich, die koordinierte Weltzeit zu verwenden und die Kind-Eigenschaft des DateTime-Werts auf DateTimeKindUTC() festzulegen. |
Die "DateTimeOffset"-Struktur
Die DateTimeOffset-Struktur stellt einen Datums- und Uhrzeitwert dar, der den Offset dieses Werts von der koordinierten Weltzeit angibt. Somit ermöglicht dieser Wert stets die eindeutige Identifizierung eines bestimmten Zeitpunkts.
Obgleich der DateTimeOffset-Typ die Funktionalität des DateTime-Typs größtenteils beinhaltet, sollte er bei der Anwendungsentwicklung nicht als Ersatz für den DateTime-Typ verwendet werden. Stattdessen eignet er sich für Anwendungen, die Folgendes unterstützen:
Eindeutige Identifizierung eines bestimmten Zeitpunkts. Der DateTimeOffset-Typ kann zur eindeutigen Definition der Bedeutung von "jetzt", zum Protokollieren von Transaktionszeiten, zum Protokollieren des Zeitpunkts von System- oder Anwendungsereignissen oder zum Aufzeichnen der Erstellungs- und Änderungszeiten von Dateien verwendet werden.
Durchführen allgemeiner arithmetischer Datums- und Uhrzeitoperationen
Beibehalten mehrerer zusammenhängender Zeiten, sofern diese Zeiten als zwei separate Werte oder zwei Member einer Struktur gespeichert werden
Hinweis: |
---|
Diese Verwendungsmöglichkeiten für DateTimeOffset-Werte sind weitaus gebräuchlicher als die für DateTime-Werte. Folglich sollte DateTimeOffset als standardmäßiger Datums- und Uhrzeittyp bei der Anwendungsentwicklung betrachtet werden. |
Ein DateTimeOffset-Wert ist nicht mit einer bestimmten Zeitzone verknüpft, sondern kann aus einer Vielzahl von Zeitzonen stammen. Um dies zu veranschaulichen, werden im folgenden Beispiel die Zeitzonen aufgelistet, zu denen eine Reihe von DateTimeOffset-Werten (einschließlich einer lokalen Pacific Normalzeit) gehören können.
Imports System.Collections.ObjectModel
Module TimeOffsets
Public Sub Main()
Dim thisTime As DateTimeOffset
thisTime = New DateTimeOffset(#06/10/2007#, New TimeSpan(-7, 0, 0))
ShowPossibleTimeZones(thisTime)
thisTime = New DateTimeOffset(#03/10/2007#, New TimeSpan(-6, 0, 0))
ShowPossibleTimeZones(thisTime)
thisTime = New DateTimeOffset(#03/10/2007#, New TimeSpan(+1, 0, 0))
ShowPossibleTimeZones(thisTime)
End Sub
Private Sub ShowPossibleTimeZones(offsetTime As DateTimeOffset)
Dim offset As TimeSpan = offsetTime.Offset
Dim timeZones As ReadOnlyCollection(Of TimeZoneInfo)
Console.WriteLine("{0} could belong to the following time zones:", _
offsetTime.ToString())
' Get all time zones defined on local system
timeZones = TimeZoneInfo.GetSystemTimeZones()
' Iterate time zones
For Each timeZone As TimeZoneInfo In timeZones
' Compare offset with offset for that date in that time zone
If timeZone.GetUtcOffset(offsetTime.DateTime).Equals(offset) Then
Console.WriteLine(" {0}", timeZone.DisplayName)
End If
Next
Console.WriteLine()
End Sub
End Module
' This example displays the following output to the console:
' 6/10/2007 12:00:00 AM -07:00 could belong to the following time zones:
' (GMT-07:00) Arizona
' (GMT-08:00) Pacific Time (US & Canada)
' (GMT-08:00) Tijuana, Baja California
'
' 3/10/2007 12:00:00 AM -06:00 could belong to the following time zones:
' (GMT-06:00) Central America
' (GMT-06:00) Central Time (US & Canada)
' (GMT-06:00) Guadalajara, Mexico City, Monterrey - New
' (GMT-06:00) Guadalajara, Mexico City, Monterrey - Old
' (GMT-06:00) Saskatchewan
'
' 3/10/2007 12:00:00 AM +01:00 could belong to the following time zones:
' (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
' (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
' (GMT+01:00) Brussels, Copenhagen, Madrid, Paris
' (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb
' (GMT+01:00) West Central Africa
using System;
using System.Collections.ObjectModel;
public class TimeOffsets
{
public static void Main()
{
DateTime thisDate = new DateTime(2007, 3, 10, 0, 0, 0);
DateTime dstDate = new DateTime(2007, 6, 10, 0, 0, 0);
DateTimeOffset thisTime;
thisTime = new DateTimeOffset(dstDate, new TimeSpan(-7, 0, 0));
ShowPossibleTimeZones(thisTime);
thisTime = new DateTimeOffset(thisDate, new TimeSpan(-6, 0, 0));
ShowPossibleTimeZones(thisTime);
thisTime = new DateTimeOffset(thisDate, new TimeSpan(+1, 0, 0));
ShowPossibleTimeZones(thisTime);
}
private static void ShowPossibleTimeZones(DateTimeOffset offsetTime)
{
TimeSpan offset = offsetTime.Offset;
ReadOnlyCollection<TimeZoneInfo> timeZones;
Console.WriteLine("{0} could belong to the following time zones:",
offsetTime.ToString());
// Get all time zones defined on local system
timeZones = TimeZoneInfo.GetSystemTimeZones();
// Iterate time zones
foreach (TimeZoneInfo timeZone in timeZones)
{
// Compare offset with offset for that date in that time zone
if (timeZone.GetUtcOffset(offsetTime.DateTime).Equals(offset))
Console.WriteLine(" {0}", timeZone.DisplayName);
}
Console.WriteLine();
}
}
// This example displays the following output to the console:
// 6/10/2007 12:00:00 AM -07:00 could belong to the following time zones:
// (GMT-07:00) Arizona
// (GMT-08:00) Pacific Time (US & Canada)
// (GMT-08:00) Tijuana, Baja California
//
// 3/10/2007 12:00:00 AM -06:00 could belong to the following time zones:
// (GMT-06:00) Central America
// (GMT-06:00) Central Time (US & Canada)
// (GMT-06:00) Guadalajara, Mexico City, Monterrey - New
// (GMT-06:00) Guadalajara, Mexico City, Monterrey - Old
// (GMT-06:00) Saskatchewan
//
// 3/10/2007 12:00:00 AM +01:00 could belong to the following time zones:
// (GMT+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna
// (GMT+01:00) Belgrade, Bratislava, Budapest, Ljubljana, Prague
// (GMT+01:00) Brussels, Copenhagen, Madrid, Paris
// (GMT+01:00) Sarajevo, Skopje, Warsaw, Zagreb
// (GMT+01:00) West Central Africa
Die Ausgabe zeigt, das jeder Datums- und Uhrzeitwert in diesem Beispiel zu mindestens drei verschiedenen Zeitzonen gehören kann. Am DateTimeOffset-Wert "6/10/2007" ist zu erkennen, dass wenn ein Datums- und Uhrzeitwert eine Sommerzeit darstellt, sein UTC-Offset nicht unbedingt dem UTC-Basisoffset der Ausgangszeitzone oder dem UTC-Offset in seinem Anzeigenamen entsprechen muss. Daraus folgt, dass ein einzelner DateTimeOffset-Wert den Übergang einer Zeitzone von und zur Sommerzeit nicht wiedergeben kann, da er nicht eng mit seiner Zeitzone verknüpft ist. Dies kann besonders problematisch sein, wenn arithmetische Datums- und Uhrzeitoperationen zum Bearbeiten eines DateTimeOffset-Werts verwendet werden. (Informationen zum Durchführen arithmetischer Datums- und Uhrzeitoperationen unter Berücksichtigung der Anpassungsregeln einer Zeitzone finden Sie unter Durchführen arithmetischer Datums- und Uhrzeitoperationen.)
Die "TimeZoneInfo"-Klasse
Die TimeZoneInfo-Klasse stellt eine beliebige Zeitzone dar und ermöglicht die Konvertierung der Datums- und Uhrzeitwerte einer Zeitzone in die einer anderen Zeitzone. Außerdem ermöglicht die TimeZoneInfo-Klasse die Arbeit mit Datums- und Uhrzeitwerten, sodass jeder Datums- und Uhrzeitwert einen bestimmten Zeitpunkt eindeutig identifiziert. Die TimeZoneInfo-Klasse ist auch erweiterbar. Sie basiert zwar auf Zeitzoneninformationen, die für Windows-Systeme bereitgestellt und in der Registrierung definiert wurden, unterstützt aber die Erstellung benutzerdefinierter Zeitzonen. Außerdem unterstützt sie die Serialisierung und Deserialisierung von Zeitzoneninformationen.
In einigen Fällen sind zur uneingeschränkten Nutzung der TimeZoneInfo-Klasse möglicherweise weitere Entwicklungsarbeiten erforderlich. Zum einen sind die Datums- und Uhrzeitwerte mit den Zeitzonen, zu denen sie gehören, nicht eng verknüpft. Sofern Ihre Anwendung also nicht über einen Mechanismus zum Verknüpfen eines Datums und einer Uhrzeit mit der zugehörigen Zeitzone verfügt, kann die Verknüpfung eines bestimmten Datums- und Uhrzeitwerts mit seiner Zeitzone leicht verloren gehen. (Eine Methode zum Verknüpfen dieser Informationen ist die Definition einer Klasse oder Struktur, die sowohl den Datums- und Uhrzeitwert als auch das zugeordnete Zeitzonenobjekt enthält.) Zum anderen bieten Windows XP und frühere Windows-Versionen keine und Windows Vista nur eingeschränkte Unterstützung von historischen Zeitzoneninformationen. Anwendungen, die zur Verarbeitung von historischen Datums- und Uhrzeitwerten vorgesehen sind, müssen in großem Umfang auf benutzerdefinierte Zeitzonen zurückgreifen.
Die Vorteile der Zeitzonenunterstützung in .NET Framework können nur dann genutzt werden, wenn die Zeitzone, zu der ein Datums- und Uhrzeitwert gehört, zum Zeitpunkt der Instanziierung des Datums- und Uhrzeitobjekts bekannt ist. Dies ist jedoch oft nicht der Fall, besonders in Web- oder Netzwerkanwendungen.