Vorgehensweise: Auflösen mehrdeutiger Zeiten

Eine mehrdeutige Zeit ist eine Zeit, die mehreren koordinierten Weltzeiten (UTC) zugeordnet werden kann. Sie tritt auf, wenn die Uhrzeit zurückgestellt wird, beispielsweise während der Umstellung von Sommerzeit in einer Zeitzone auf Standardzeit. Bei der Verarbeitung einer mehrdeutigen Zeit haben Sie eine der folgenden Möglichkeiten:

  • Treffen Sie eine Annahme darüber, wie die Zeit UTC zuzuordnen ist. Beispielsweise können Sie davon ausgehen, dass eine mehrdeutige Zeit immer in der Standardzeit der Zeitzone ausgedrückt wird.

  • Wenn die mehrdeutige Zeit ein vom Benutzer eingegebenes Datenelement ist, können Sie es dem Benutzer überlassen, die Mehrdeutigkeit aufzulösen.

Dieses Thema zeigt, wie eine mehrdeutige Zeitangabe mithilfe der Annahme aufgelöst werden kann, dass es sich um die Standardzeit der Zeitzone handelt.

So ordnen Sie eine mehrdeutige Zeit der Standardzeit einer Zeitzone zu

  1. Rufen Sie die IsAmbiguousTime-Methode auf, um zu bestimmen, ob die Zeitangabe mehrdeutig ist.

  2. Wenn die Zeitangabe mehrdeutig ist, subtrahieren Sie die Zeit vom TimeSpan-Objekt, das von der BaseUtcOffset-Eigenschaft der Zeitzone zurückgegeben wird.

  3. Rufen Sie die SpecifyKind-Methode static (Shared in Visual Basic .NET) auf, um die Eigenschaft Kind des UTC-Datum- und Uhrzeitwerts auf DateTimeKind.Utc festzulegen.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie die Konvertierung einer mehrdeutigen Zeitangabe in UTC vorgenommen wird, indem angenommen wird, dass dies die Standardzeit der lokalen Zeitzone darstellt.

private static DateTime ResolveAmbiguousTime(DateTime ambiguousTime)
{
    // Time is not ambiguous
    if (!TimeZoneInfo.Local.IsAmbiguousTime(ambiguousTime))
    {
        return ambiguousTime;
    }
    // Time is ambiguous
    else
    {
        DateTime utcTime = DateTime.SpecifyKind(ambiguousTime - TimeZoneInfo.Local.BaseUtcOffset,
                                                DateTimeKind.Utc);
        Console.WriteLine("{0} local time corresponds to {1} {2}.",
                          ambiguousTime, utcTime, utcTime.Kind.ToString());
        return utcTime;
    }
}
Private Function ResolveAmbiguousTime(ambiguousTime As Date) As Date
    ' Time is not ambiguous
    If Not TimeZoneInfo.Local.IsAmbiguousTime(ambiguousTime) Then
        Return TimeZoneInfo.ConvertTimeToUtc(ambiguousTime)
        ' Time is ambiguous
    Else
        Dim utcTime As Date = DateTime.SpecifyKind(ambiguousTime - TimeZoneInfo.Local.BaseUtcOffset, DateTimeKind.Utc)
        Console.WriteLine("{0} local time corresponds to {1} {2}.", ambiguousTime, utcTime, utcTime.Kind.ToString())
        Return utcTime
    End If
End Function

Das Beispiel besteht aus einer Methode namens ResolveAmbiguousTime, die ermittelt, ob der ihr übergebene DateTime-Wert mehrdeutig ist. Wenn der Wert mehrdeutig ist, gibt die Methode einen DateTime-Wert zurück, der die entsprechende UTC-Zeit darstellt. Die Methode führt diese Konvertierung durch, indem sie den Wert der BaseUtcOffset-Eigenschaft der lokalen Zeitzone von der Ortszeit subtrahiert.

Normalerweise wird eine mehrdeutige Zeitangabe durch Aufrufen der GetAmbiguousTimeOffsets-Methode verarbeitet, um ein Array von TimeSpan-Objekten abzurufen, die die möglichen UTC-Abweichungen der mehrdeutigen Zeitangabe enthalten. In diesem Beispiel wird jedoch die willkürliche Annahme getroffen, dass eine mehrdeutige Zeit immer der Standardzeit der Zeitzone zugeordnet werden soll. Die BaseUtcOffset-Eigenschaft gibt die Abweichung zwischen UTC und der Standardzeit einer Zeitzone zurück.

In diesem Beispiel erfolgen alle Verweise auf die lokale Zeitzone über die TimeZoneInfo.Local-Eigenschaft. Die lokale Zeitzone wird nie einer Objektvariablen zugewiesen. Dies ist eine empfohlene Vorgehensweise, da ein Aufruf der TimeZoneInfo.ClearCachedData-Methode Objekte ungültig macht, denen die lokale Zeitzone zugewiesen ist.

Kompilieren des Codes

Für dieses Beispiel benötigen Sie Folgendes:

  • Der System-Namespace muss mit der using-Anweisung importiert werden (in C#-Code erforderlich).

Weitere Informationen