Konvertieren zwischen DateTime und DateTimeOffset

Obwohl die DateTimeOffset-Struktur umfassendere Zeitzonenunterstützung bietet als die DateTime-Struktur, werden DateTime-Parameter häufiger in Methodenaufrufen verwendet. Aufgrund dieses Ansatzes ist die Möglichkeit wichtig, DateTimeOffset-Werte in DateTime-Werte zu konvertieren und umgekehrt. Dieser Artikel zeigt, wie Sie diese Konvertierungen auf eine Weise ausführen, bei der so viele Zeitzoneninformationen wie möglich beibehalten werden.

Hinweis

Die DateTime- und DateTimeOffset-Typen weisen beide einige Einschränkungen hinsichtlich der Darstellung von Uhrzeiten in Zeitzonen auf. Mit der Kind-Eigenschaft kann DateTime nur die koordinierte Weltzeit (UTC) und die lokale Zeitzone des Systems widerspiegeln. DateTimeOffset gibt die Abweichung einer Uhrzeit von UTC wieder, aber nicht die tatsächliche Zeitzone, zu der diese Abweichung gehört. Weitere Informationen zu Uhrzeitwerten und zur Unterstützung von Zeitzonen finden Sie unter Wählen zwischen DateTime, DateTimeOffset, TimeSpan und TimeZoneInfo.

Konvertierungen von DateTime in DateTimeOffset

Die DateTimeOffset-Struktur bietet zwei gleichwertige Möglichkeiten zum Konvertieren von DateTime in DateTimeOffset, die sich für die meisten Konvertierungen eignen:

Für UTC und lokale DateTime-Werte gibt die Offset-Eigenschaft des sich ergebenden DateTimeOffset-Werts die UTC-Abweichung oder Abweichung der lokalen Zeitzone genau wieder. Der folgende Code konvertiert z. B. eine UTC-Zeitangabe in den entsprechenden DateTimeOffset-Wert:

DateTime utcTime1 = new DateTime(2008, 6, 19, 7, 0, 0);
utcTime1 = DateTime.SpecifyKind(utcTime1, DateTimeKind.Utc);
DateTimeOffset utcTime2 = utcTime1;
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}",
                  utcTime1,
                  utcTime1.Kind,
                  utcTime2);
// This example displays the following output to the console:
//    Converted 6/19/2008 7:00:00 AM Utc to a DateTimeOffset value of 6/19/2008 7:00:00 AM +00:00
Dim utcTime1 As Date = Date.SpecifyKind(#06/19/2008 7:00AM#, _
                                        DateTimeKind.Utc)
Dim utcTime2 As DateTimeOffset = utcTime1
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}", _
                  utcTime1, _
                  utcTime1.Kind.ToString(), _
                  utcTime2)
' This example displays the following output to the console:
'    Converted 6/19/2008 7:00:00 AM Utc to a DateTimeOffset value of 6/19/2008 7:00:00 AM +00:00                        

In diesem Fall beträgt die Abweichung der utcTime2-Variablen 00:00. Der folgende Code konvertiert analog dazu eine lokale Zeitangabe in den entsprechenden DateTimeOffset-Wert:

DateTime localTime1 = new DateTime(2008, 6, 19, 7, 0, 0);
localTime1 = DateTime.SpecifyKind(localTime1, DateTimeKind.Local);
DateTimeOffset localTime2 = localTime1;
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}",
                  localTime1,
                  localTime1.Kind,
                  localTime2);
// This example displays the following output to the console:
//    Converted 6/19/2008 7:00:00 AM Local to a DateTimeOffset value of 6/19/2008 7:00:00 AM -07:00
Dim localTime1 As Date = Date.SpecifyKind(#06/19/2008 7:00AM#, DateTimeKind.Local)
Dim localTime2 As DateTimeOffset = localTime1
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}", _
                  localTime1, _
                  localTime1.Kind.ToString(), _
                  localTime2)
' This example displays the following output to the console:
'    Converted 6/19/2008 7:00:00 AM Local to a DateTimeOffset value of 6/19/2008 7:00:00 AM -07:00

Für DateTime-Werte, deren Kind-Eigenschaft DateTimeKind.Unspecified lautet, generieren diese beiden Konvertierungsmethoden allerdings einenDateTimeOffset-Wert, dessen Abweichung der Abweichung der lokalen Zeitzone entspricht. Die Konvertierung wird im folgenden Beispiel gezeigt, das in der Zeitzone „U.S. Pacific Standard“ ausgeführt wird:

DateTime time1 = new DateTime(2008, 6, 19, 7, 0, 0);  // Kind is DateTimeKind.Unspecified
DateTimeOffset time2 = time1;
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}",
                  time1,
                  time1.Kind,
                  time2);
// This example displays the following output to the console:
//    Converted 6/19/2008 7:00:00 AM Unspecified to a DateTimeOffset value of 6/19/2008 7:00:00 AM -07:00
Dim time1 As Date = #06/19/2008 7:00AM#      ' Kind is DateTimeKind.Unspecified
Dim time2 As DateTimeOffset = time1
Console.WriteLine("Converted {0} {1} to a DateTimeOffset value of {2}", _
                  time1, _
                  time1.Kind.ToString(), _
                  time2)
' This example displays the following output to the console:
'    Converted 6/19/2008 7:00:00 AM Unspecified to a DateTimeOffset value of 6/19/2008 7:00:00 AM -07:00

Wenn der DateTime-Wert das Datum und die Uhrzeit in einer anderen Zeit als der lokalen Zeitzone oder der UTC wiedergibt, können Sie den Wert in einen DateTimeOffset-Wert konvertieren und die Zeitzoneninformationen beibehalten, indem Sie den überladenen DateTimeOffset-Konstruktor aufrufen. Das folgende Beispiel instanziiert ein DateTimeOffset-Objekt, das die Zeitzone „Central Standard Time“ angibt:

DateTime time1 = new DateTime(2008, 6, 19, 7, 0, 0);     // Kind is DateTimeKind.Unspecified
try
{
   DateTimeOffset time2 = new DateTimeOffset(time1,
                  TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(time1));
   Console.WriteLine("Converted {0} {1} to a DateTime value of {2}",
                     time1,
                     time1.Kind,
                     time2);
}
// Handle exception if time zone is not defined in registry
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("Unable to identify target time zone for conversion.");
}
// This example displays the following output to the console:
//    Converted 6/19/2008 7:00:00 AM Unspecified to a DateTime value of 6/19/2008 7:00:00 AM -05:00
Dim time1 As Date = #06/19/2008 7:00AM#      ' Kind is DateTimeKind.Unspecified
Try
    Dim time2 As New DateTimeOffset(time1, _
                     TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(time1))
    Console.WriteLine("Converted {0} {1} to a DateTime value of {2}", _
                      time1, _
                      time1.Kind.ToString(), _
                      time2)
    ' Handle exception if time zone is not defined in registry
Catch e As TimeZoneNotFoundException
    Console.WriteLine("Unable to identify target time zone for conversion.")
End Try
' This example displays the following output to the console:
'    Converted 6/19/2008 7:00:00 AM Unspecified to a DateTime value of 6/19/2008 7:00:00 AM -05:00

Der zweite Parameter für diese Konstruktorüberladung ist ein TimeSpan-Objekt, das den Zeitversatz zu UTC darstellt. Rufen Sie es ab, indem Sie die TimeZoneInfo.GetUtcOffset(DateTime) -Methode der entsprechenden Zeitzone der Uhrzeit aufrufen. Der einzige Parameter der Methode ist der DateTime-Wert, der das Datum und die Uhrzeit darstellt, das bzw. die konvertiert werden soll. Wenn die Zeitzone die Sommerzeit unterstützt, ermöglicht dieser Parameter der Methode, die richtige Abweichung für dieses spezielle Datum und diese spezielle Uhrzeit zu bestimmen.

Konvertierungen von DateTimeOffset in DateTime

Die DateTime-Eigenschaft wird am häufigsten verwendet, um die Konvertierung von DateTimeOffset in DateTime auszuführen. Sie gibt jedoch einen DateTime-Wert zurück, dessen Kind-Eigenschaft Unspecified ist, wie das folgende Beispiel zeigt:

DateTime baseTime = new DateTime(2008, 6, 19, 7, 0, 0);
DateTimeOffset sourceTime;
DateTime targetTime;

// Convert UTC to DateTime value
sourceTime = new DateTimeOffset(baseTime, TimeSpan.Zero);
targetTime = sourceTime.DateTime;
Console.WriteLine("{0} converts to {1} {2}",
                  sourceTime,
                  targetTime,
                  targetTime.Kind);

// Convert local time to DateTime value
sourceTime = new DateTimeOffset(baseTime,
                                TimeZoneInfo.Local.GetUtcOffset(baseTime));
targetTime = sourceTime.DateTime;
Console.WriteLine("{0} converts to {1} {2}",
                  sourceTime,
                  targetTime,
                  targetTime.Kind);

// Convert Central Standard Time to a DateTime value
try
{
   TimeSpan offset = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(baseTime);
   sourceTime = new DateTimeOffset(baseTime, offset);
   targetTime = sourceTime.DateTime;
   Console.WriteLine("{0} converts to {1} {2}",
                     sourceTime,
                     targetTime,
                     targetTime.Kind);
}
catch (TimeZoneNotFoundException)
{
   Console.WriteLine("Unable to create DateTimeOffset based on U.S. Central Standard Time.");
}
// This example displays the following output to the console:
//    6/19/2008 7:00:00 AM +00:00 converts to 6/19/2008 7:00:00 AM Unspecified
//    6/19/2008 7:00:00 AM -07:00 converts to 6/19/2008 7:00:00 AM Unspecified
//    6/19/2008 7:00:00 AM -05:00 converts to 6/19/2008 7:00:00 AM Unspecified
Const baseTime As Date = #06/19/2008 7:00AM#
Dim sourceTime As DateTimeOffset
Dim targetTime As Date

' Convert UTC to DateTime value
sourceTime = New DateTimeOffset(baseTime, TimeSpan.Zero)
targetTime = sourceTime.DateTime
Console.WriteLine("{0} converts to {1} {2}", _
                  sourceTime, _
                  targetTime, _
                  targetTime.Kind.ToString())

' Convert local time to DateTime value
sourceTime = New DateTimeOffset(baseTime, _
                                TimeZoneInfo.Local.GetUtcOffset(baseTime))
targetTime = sourceTime.DateTime
Console.WriteLine("{0} converts to {1} {2}", _
                  sourceTime, _
                  targetTime, _
                  targetTime.Kind.ToString())

' Convert Central Standard Time to a DateTime value
Try
    Dim offset As TimeSpan = TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(baseTime)
    sourceTime = New DateTimeOffset(baseTime, offset)
    targetTime = sourceTime.DateTime
    Console.WriteLine("{0} converts to {1} {2}", _
                      sourceTime, _
                      targetTime, _
                      targetTime.Kind.ToString())
Catch e As TimeZoneNotFoundException
    Console.WriteLine("Unable to create DateTimeOffset based on U.S. Central Standard Time.")
End Try
' This example displays the following output to the console:
'    6/19/2008 7:00:00 AM +00:00 converts to 6/19/2008 7:00:00 AM Unspecified
'    6/19/2008 7:00:00 AM -07:00 converts to 6/19/2008 7:00:00 AM Unspecified
'    6/19/2008 7:00:00 AM -05:00 converts to 6/19/2008 7:00:00 AM Unspecified                       

Das Beispiel oben zeigt, dass sämtliche Informationen zur Beziehung des DateTimeOffset-Werts zu UTC bei der Konvertierung verloren gehen, wenn die DateTime-Eigenschaft verwendet wird. Dieses Verhalten wirkt sich auch auf DateTimeOffset-Werte aus, die der UTC-Zeit oder der lokalen Uhrzeit des Systems entsprechen, weil die DateTime-Struktur in ihrer Kind-Eigenschaft nur diese beiden Zeitzonen widerspiegelt.

Wenn Sie beim Konvertieren eines DateTimeOffset- in einen DateTime-Wert so viele Zeitzoneninformationen wie möglich beibehalten möchten, können Sie die DateTimeOffset.UtcDateTime- und DateTimeOffset.LocalDateTime-Eigenschaften verwenden.

Konvertieren einer UTC-Zeit

Um anzugeben, dass es sich bei einem konvertierten DateTime-Wert um die UTC-Zeit handelt, können Sie den Wert der DateTimeOffset.UtcDateTime-Eigenschaft abrufen. Sie unterscheidet sich von der DateTime -Eigenschaft auf zweierlei Weise:

  • Sie gibt einen DateTime-Wert zurück, dessen Kind-Eigenschaft Utc ist.

  • Wenn der Wert der Offset-Eigenschaft nicht TimeSpan.Zero entspricht, wird die Zeit in UTC konvertiert.

Hinweis

Wenn Ihre Anwendung erfordert, dass konvertierte DateTime-Werte eine bestimmte Uhrzeit eindeutig identifizieren, sollten Sie die DateTimeOffset.UtcDateTime-Eigenschaft verwenden, um alle Konvertierungen von DateTimeOffset in DateTime zu verarbeiten.

Der folgende Code verwendet die UtcDateTime-Eigenschaft, um einen DateTimeOffset-Wert, dessen Offset TimeSpan.Zero entspricht, in einen DateTime-Wert zu konvertieren:

DateTimeOffset utcTime1 = new DateTimeOffset(2008, 6, 19, 7, 0, 0, TimeSpan.Zero);
DateTime utcTime2 = utcTime1.UtcDateTime;
Console.WriteLine("{0} converted to {1} {2}",
                  utcTime1,
                  utcTime2,
                  utcTime2.Kind);
// The example displays the following output to the console:
//   6/19/2008 7:00:00 AM +00:00 converted to 6/19/2008 7:00:00 AM Utc
Dim utcTime1 As New DateTimeOffset(#06/19/2008 7:00AM#, TimeSpan.Zero)
Dim utcTime2 As Date = utcTime1.UtcDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  utcTime1, _
                  utcTime2, _
                  utcTime2.Kind.ToString())
' The example displays the following output to the console:
'   6/19/2008 7:00:00 AM +00:00 converted to 6/19/2008 7:00:00 AM Utc                              

Der folgende Code verwendet die UtcDateTime-Eigenschaft, um sowohl eine Zeitzonenkonvertierung als auch eine Typkonvertierung für einen DateTimeOffset-Wert auszuführen:

DateTimeOffset originalTime = new DateTimeOffset(2008, 6, 19, 7, 0, 0, new TimeSpan(5, 0, 0));
DateTime utcTime = originalTime.UtcDateTime;
Console.WriteLine("{0} converted to {1} {2}",
                  originalTime,
                  utcTime,
                  utcTime.Kind);
// The example displays the following output to the console:
//       6/19/2008 7:00:00 AM +05:00 converted to 6/19/2008 2:00:00 AM Utc
Dim originalTime As New DateTimeOffset(#6/19/2008 7:00AM#, _
                                       New TimeSpan(5, 0, 0))
Dim utcTime As Date = originalTime.UtcDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  originalTime, _
                  utcTime, _
                  utcTime.Kind.ToString())
' The example displays the following output to the console:
'       6/19/2008 7:00:00 AM +05:00 converted to 6/19/2008 2:00:00 AM Utc

Konvertieren einer lokalen Uhrzeit

Um anzugeben, dass ein DateTimeOffset-Wert die lokale Uhrzeit darstellt, können Sie den von der DateTimeOffset.DateTime-Eigenschaft zurückgegebenen DateTime-Wert an die static (Shared in Visual Basic) SpecifyKind-Methode übergeben. Die Methode gibt das an sie übergebene Datum und die übergebene Uhrzeit als ersten Parameter zurück, legt aber die Kind-Eigenschaft auf den vom zweiten Parameter angegebenen Wert fest. Der folgende Code verwendet die SpecifyKind-Methode, um einen DateTimeOffset-Wert zu konvertieren, dessen Abweichung der Abweichung der lokalen Zeitzone entspricht:

DateTime sourceDate = new DateTime(2008, 6, 19, 7, 0, 0);
DateTimeOffset utcTime1 = new DateTimeOffset(sourceDate,
                          TimeZoneInfo.Local.GetUtcOffset(sourceDate));
DateTime utcTime2 = utcTime1.DateTime;
if (utcTime1.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(utcTime1.DateTime)))
   utcTime2 = DateTime.SpecifyKind(utcTime2, DateTimeKind.Local);

Console.WriteLine("{0} converted to {1} {2}",
                  utcTime1,
                  utcTime2,
                  utcTime2.Kind);
// The example displays the following output to the console:
//   6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local
Dim sourceDate As Date = #06/19/2008 7:00AM#
Dim utcTime1 As New DateTimeOffset(sourceDate, _
                                   TimeZoneInfo.Local.GetUtcOffset(sourceDate))
Dim utcTime2 As Date = utcTime1.DateTime
If utcTime1.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(utcTime1.DateTime)) Then
    utcTime2 = DateTime.SpecifyKind(utcTime2, DateTimeKind.Local)
End If
Console.WriteLine("{0} converted to {1} {2}", _
                  utcTime1, _
                  utcTime2, _
                  utcTime2.Kind.ToString())
' The example displays the following output to the console:
'   6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local      

Sie können auch die DateTimeOffset.LocalDateTime-Eigenschaft verwenden, um einen DateTimeOffset-Wert in einen lokalen DateTime-Wert zu konvertieren. Die Kind-Eigenschaft des zurückgegebenen DateTime-Werts ist Local. Der folgende Code verwendet die DateTimeOffset.LocalDateTime-Eigenschaft, um einen DateTimeOffset-Wert zu konvertieren, dessen Abweichung der Abweichung der lokalen Zeitzone entspricht:

DateTime sourceDate = new DateTime(2008, 6, 19, 7, 0, 0);
DateTimeOffset localTime1 = new DateTimeOffset(sourceDate,
                          TimeZoneInfo.Local.GetUtcOffset(sourceDate));
DateTime localTime2 = localTime1.LocalDateTime;

Console.WriteLine("{0} converted to {1} {2}",
                  localTime1,
                  localTime2,
                  localTime2.Kind);
// The example displays the following output to the console:
//   6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local
Dim sourceDate As Date = #06/19/2008 7:00AM#
Dim localTime1 As New DateTimeOffset(sourceDate, _
                                   TimeZoneInfo.Local.GetUtcOffset(sourceDate))
Dim localTime2 As Date = localTime1.LocalDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  localTime1, _
                  localTime2, _
                  localTime2.Kind.ToString())
' The example displays the following output to the console:
'   6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local      

Wenn Sie einen DateTime-Wert mithilfe der DateTimeOffset.LocalDateTime-Eigenschaft abrufen, konvertiert der get-Accessor der Eigenschaft den DateTimeOffset-Wert zuerst in UTC und dann durch Aufrufen der ToLocalTime-Methode in die lokale Uhrzeit. Dieses Verhalten bedeutet, dass Sie einen Wert aus der DateTimeOffset.LocalDateTime-Eigenschaft abrufen können, um gleichzeitig mit einer Typkonvertierung auch eine Zeitzonenkonvertierung auszuführen. Es bedeutet auch, dass die beim Durchführen der Konvertierung die Anpassungsregeln der lokalen Zeitzone angewendet werden. Der folgende Code zeigt die Verwendung der DateTimeOffset.LocalDateTime-Eigenschaft, um sowohl eine Typ- als auch eine Zeitzonenkonvertierung auszuführen. Die Beispielausgabe gilt für einen Computer, der auf die pazifische Zeitzone (USA und Kanada) festgelegt ist. Das Novemberdatum gibt „Pacific Standard Time“ (UTC-8) an, während das Junidatum Sommerzeit (UTC-7) angibt.

DateTimeOffset originalDate;
DateTime localDate;

// Convert time originating in a different time zone
originalDate = new DateTimeOffset(2008, 6, 18, 7, 0, 0,
                                  new TimeSpan(-5, 0, 0));
localDate = originalDate.LocalDateTime;
Console.WriteLine("{0} converted to {1} {2}",
                  originalDate,
                  localDate,
                  localDate.Kind);
// Convert time originating in a different time zone
// so local time zone's adjustment rules are applied
originalDate = new DateTimeOffset(2007, 11, 4, 4, 0, 0,
                                  new TimeSpan(-5, 0, 0));
localDate = originalDate.LocalDateTime;
Console.WriteLine("{0} converted to {1} {2}",
                  originalDate,
                  localDate,
                  localDate.Kind);
// The example displays the following output to the console,
// when you run it on a machine that is set to Pacific Time (US & Canada):
//       6/18/2008 7:00:00 AM -05:00 converted to 6/18/2008 5:00:00 AM Local
//       11/4/2007 4:00:00 AM -05:00 converted to 11/4/2007 1:00:00 AM Local
Dim originalDate As DateTimeOffset
Dim localDate As Date

' Convert time originating in a different time zone
originalDate = New DateTimeOffset(#06/19/2008 7:00AM#, _
                                  New TimeSpan(-5, 0, 0))
localDate = originalDate.LocalDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  originalDate, _
                  localDate, _
                  localDate.Kind.ToString())
' Convert time originating in a different time zone 
' so local time zone's adjustment rules are applied
originalDate = New DateTimeOffset(#11/04/2007 4:00AM#, _
                                  New TimeSpan(-5, 0, 0))
localDate = originalDate.LocalDateTime
Console.WriteLine("{0} converted to {1} {2}", _
                  originalDate, _
                  localDate, _
                  localDate.Kind.ToString())
' The example displays the following output to the console,
' when you run it on a machine that is set to Pacific Time (US & Canada):
'       6/18/2008 7:00:00 AM -05:00 converted to 6/18/2008 5:00:00 AM Local
'       11/4/2007 4:00:00 AM -05:00 converted to 11/4/2007 1:00:00 AM Local

Eine allgemeine Konvertierungsmethode

Das folgende Beispiel definiert eine Methode namens ConvertFromDateTimeOffset, die DateTimeOffset-Werte in DateTime-Werte konvertiert. Basierend auf der Abweichung bestimmt die Methode, ob es sich beim DateTimeOffset-Wert um eine UTC-Zeitangabe, eine lokale Uhrzeit oder eine andere Uhrzeit handelt, und sie definiert die Kind-Eigenschaft des zurückgegebenen Datums- und Uhrzeitwerts entsprechend.

static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime)
{
   if (dateTime.Offset.Equals(TimeSpan.Zero))
      return dateTime.UtcDateTime;
   else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime)))
      return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local);
   else
      return dateTime.DateTime;
}
Function ConvertFromDateTimeOffset(dateTime As DateTimeOffset) As Date
    If dateTime.Offset.Equals(TimeSpan.Zero) Then
        Return dateTime.UtcDateTime
    ElseIf dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime))
        Return Date.SpecifyKind(dateTime.DateTime, DateTimeKind.Local)
    Else
        Return dateTime.DateTime
    End If
End Function

Das folgende Beispiel ruft die ConvertFromDateTimeOffset-Methode auf, um DateTimeOffset-Werte zu konvertieren, die eine UTC-Zeitangabe, eine lokale Uhrzeit und eine Zeit in der Zeitzone „U.S. Central Standard Time“ darstellen.

DateTime timeComponent = new DateTime(2008, 6, 19, 7, 0, 0);
DateTime returnedDate;

// Convert UTC time
DateTimeOffset utcTime = new DateTimeOffset(timeComponent, TimeSpan.Zero);
returnedDate = ConvertFromDateTimeOffset(utcTime);
Console.WriteLine("{0} converted to {1} {2}",
                  utcTime,
                  returnedDate,
                  returnedDate.Kind);

// Convert local time
DateTimeOffset localTime = new DateTimeOffset(timeComponent,
                           TimeZoneInfo.Local.GetUtcOffset(timeComponent));
returnedDate = ConvertFromDateTimeOffset(localTime);
Console.WriteLine("{0} converted to {1} {2}",
                  localTime,
                  returnedDate,
                  returnedDate.Kind);

// Convert Central Standard Time
DateTimeOffset cstTime = new DateTimeOffset(timeComponent,
               TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(timeComponent));
returnedDate = ConvertFromDateTimeOffset(cstTime);
Console.WriteLine("{0} converted to {1} {2}",
                  cstTime,
                  returnedDate,
                  returnedDate.Kind);
// The example displays the following output to the console:
//    6/19/2008 7:00:00 AM +00:00 converted to 6/19/2008 7:00:00 AM Utc
//    6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local
//    6/19/2008 7:00:00 AM -05:00 converted to 6/19/2008 7:00:00 AM Unspecified
Dim timeComponent As Date = #06/19/2008 7:00AM#
Dim returnedDate As Date

' Convert UTC time
Dim utcTime As New DateTimeOffset(timeComponent, TimeSpan.Zero)
returnedDate = ConvertFromDateTimeOffset(utcTime)
Console.WriteLine("{0} converted to {1} {2}", _
                  utcTime, _
                  returnedDate, _
                  returnedDate.Kind.ToString())

' Convert local time
Dim localTime As New DateTimeOffset(timeComponent, _
                                    TimeZoneInfo.Local.GetUtcOffset(timeComponent))
returnedDate = ConvertFromDateTimeOffset(localTime)
Console.WriteLine("{0} converted to {1} {2}", _
                  localTime, _
                  returnedDate, _
                  returnedDate.Kind.ToString())

' Convert Central Standard Time
Dim cstTime As New DateTimeOffset(timeComponent, _
               TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(timeComponent))
returnedDate = ConvertFromDateTimeOffset(cstTime)
Console.WriteLine("{0} converted to {1} {2}", _
                  cstTime, _
                  returnedDate, _
                  returnedDate.Kind.ToString())
' The example displays the following output to the console:
'    6/19/2008 7:00:00 AM +00:00 converted to 6/19/2008 7:00:00 AM Utc
'    6/19/2008 7:00:00 AM -07:00 converted to 6/19/2008 7:00:00 AM Local
'    6/19/2008 7:00:00 AM -05:00 converted to 6/19/2008 7:00:00 AM Unspecified

Hinweis

Bei diesem Code wird von zwei Annahmen ausgegangen, die je nach Anwendung und der Quelle ihrer Datums- und Uhrzeitwerte nicht immer zutreffen:

  • Es wird angenommen, dass ein Datums- und Uhrzeitwert, dessen Abweichung TimeSpan.Zero beträgt, eine UTC-Zeitangabe darstellt. Tatsächlich ist UTC keine Zeit in einer bestimmten Zeitzone, sondern die Uhrzeit, nach der alle Uhrzeiten in den Zeitzonen der Welt standardisiert werden. Zeitzonen können auch eine Abweichung von Zero aufweisen.

  • Es wird angenommen, dass ein Datums- und Uhrzeitwert, dessen Abweichung der Abweichung der lokalen Zeitzone entspricht, die lokale Zeitzone darstellt. Dies ist möglicherweise nicht der Fall, weil Datums- und Uhrzeitwerte nicht mehr mit ihrer ursprünglichen Zeitzone verknüpft sind. Datum und Uhrzeit können aus einer anderen Zeitzone mit der gleichen Abweichung stammen.

Weitere Informationen