Freigeben über


Gewusst wie: Auflösen von mehrdeutigen Zeiten

Bei einer mehrdeutigen Zeit handelt es sich um eine Zeit, die mehreren koordinierten Weltzeiten (Coordinated Universal Time; UTC) zugeordnet ist. Sie tritt auf, wenn die Uhrzeit zurückgestellt wird, beispielsweise bei der Umstellung von der Sommerzeit in einer Zeitzone auf die Standardzeit. Bei der Behandlung einer mehrdeutigen Zeit können Sie wie folgt vorgehen:

  • Treffen Sie eine Annahme darüber, wie die Zeit UTC zugeordnet ist. Sie können zum Beispiel annehmen, dass eine mehrdeutige Zeit immer als Standardzeit der Zeitzone ausgedrückt wird.

  • Wenn die mehrdeutige Zeit vom Benutzer eingegeben wurde, können Sie dem Benutzer die Auslösung der Mehrdeutigkeit überlassen.

In diesem Thema wird erläutert, wie eine mehrdeutige Zeit durch die Annahme aufgelöst wird, dass sie die Standardzeit der Zeitzone darstellt.

So ordnen Sie eine mehrdeutige Zeit der Standardzeit einer Zeitzone zu

  1. Rufen Sie die IsAmbiguousTime-Methode auf, um festzustellen, ob die Zeit mehrdeutig ist.

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

  3. Rufen Sie die static (Shared in Visual Basic .NET) SpecifyKind-Methode auf, um für die Kind-Eigenschaft des UTC-Datums und der UTC-Uhrzeit den Wert DateTimeKind.Utc festzulegen.

Beispiel

Im folgenden Beispiel wird veranschaulicht, wie Sie eine mehrdeutige Zeit in UTC konvertieren, indem davon ausgegangen wird, dass sie die Standardzeit der lokalen Zeitzone darstellt.

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
private 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;            
   }   
}

Das Beispiel umfasst die ResolveAmbiguousTime-Methode, mit der ermittelt wird, ob der an sie ü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 der Wert der BaseUtcOffset-Eigenschaft der lokalen Zeitzone von der Ortszeit subtrahiert wird.

Normalerweise wird eine mehrdeutige Zeit behandelt, indem die GetAmbiguousTimeOffsets-Methode aufgerufen wird, um ein Array von TimeSpan-Objekten, die die möglichen UTC-Offsets für die mehrdeutige Zeit enthalten, abzurufen. In diesem Beispiel wird jedoch die willkürliche Annahme getroffen, dass eine mehrdeutige Zeit immer der Standardzeit der Zeitzone zugeordnet ist. Die BaseUtcOffset-Eigenschaft gibt den Offset zwischen UTC und der Standardzeit einer Zeitzone zurück.

In diesem Beispiel erfolgen alle Verweise auf die lokale Zeitzone über die TimeZoneInfo.Local-Eigenschaft, und die lokale Zeitzone ist nie einer Objektvariablen zugewiesen. Hierbei handelt es sich um eine empfohlene Vorgehensweise, da durch einen Aufruf der TimeZoneInfo.ClearCachedData-Methode alle Objekte, denen die lokale Zeitzone zugewiesen ist, ungültig werden.

Kompilieren des Codes

Für dieses Beispiel ist Folgendes erforderlich:

  • Dem Projekt muss ein Verweis auf System.Core.dll hinzugefügt werden.

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

Siehe auch

Aufgaben

Gewusst wie: Auflösen mehrdeutiger Zeiten durch den Benutzer

Weitere Ressourcen

Datumsangaben, Uhrzeiten und Zeitzonen