Konwertowanie między wartościami DateTime i DateTimeOffset
Mimo że struktura DateTimeOffset zapewnia większy stopień świadomości strefy czasowej niż struktura DateTime, parametry DateTime są używane częściej w wywołaniach metod. Ze względu na to podejście ważna jest możliwość konwertowania wartości DateTimeOffset na wartości DateTime i odwrotnie. W tym artykule pokazano, jak wykonać te konwersje w sposób, który zachowuje jak najwięcej informacji o strefie czasowej, jak to możliwe.
Uwaga
Zarówno DateTime, jak i typy DateTimeOffset mają pewne ograniczenia podczas reprezentowania czasów w strefach czasowych. Dzięki właściwości KindDateTime może odzwierciedlać tylko uniwersalny czas koordynowany (UTC) i lokalną strefę czasową systemu. DateTimeOffset odzwierciedla przesunięcie czasu od UTC, ale nie odzwierciedla rzeczywistej strefy czasowej, do której należy to przesunięcie. Aby uzyskać więcej informacji o wartościach czasu i obsłudze stref czasowych, zobacz Wybieranie między wartościami DateTime, DateTimeOffset, TimeSpan i TimeZoneInfo.
Konwersje z DateTime na DateTimeOffset
Struktura DateTimeOffset zapewnia dwa równoważne sposoby konwersji z DateTime na DateTimeOffset, które sprawdzają się w większości przypadków.
Konstruktor DateTimeOffset, który tworzy nowy obiekt DateTimeOffset na podstawie wartości DateTime.
Niejawny operator konwersji, który umożliwia przypisanie wartości DateTime do obiektu DateTimeOffset.
W przypadku wartości UTC i lokalnej DateTime, właściwość Offset w wynikowej wartości DateTimeOffset dokładnie odzwierciedla przesunięcie strefy czasowej UTC lub lokalnej. Na przykład następujący kod konwertuje czas UTC na równoważną wartość DateTimeOffset:
DateTime utcTime1 = new DateTime(2008, 6, 19, 7, 0, 0);
utcTime1 = DateTime.SpecifyKind(utcTime1, DateTimeKind.Utc);
DateTimeOffset utcTime2 = utcTime1;
Console.WriteLine($"Converted {utcTime1} {utcTime1.Kind} to a DateTimeOffset value of {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
W takim przypadku przesunięcie zmiennej utcTime2
wynosi 00:00. Podobnie poniższy kod konwertuje czas lokalny na równoważną wartość DateTimeOffset:
DateTime localTime1 = new DateTime(2008, 6, 19, 7, 0, 0);
localTime1 = DateTime.SpecifyKind(localTime1, DateTimeKind.Local);
DateTimeOffset localTime2 = localTime1;
Console.WriteLine($"Converted {localTime1} {localTime1.Kind} to a DateTimeOffset value of {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
Jednak w przypadku wartości DateTime, których właściwość Kind jest DateTimeKind.Unspecified, te dwie metody konwersji prowadzą do wartości DateTimeOffset, której przesunięcie odpowiada lokalnej strefie czasowej. Konwersja jest pokazana w poniższym przykładzie, który jest wykonywany w strefie czasowej Pacyficznego Czasu Standardowego USA.
DateTime time1 = new DateTime(2008, 6, 19, 7, 0, 0); // Kind is DateTimeKind.Unspecified
DateTimeOffset time2 = time1;
Console.WriteLine($"Converted {time1} {time1.Kind} to a DateTimeOffset value of {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
Jeśli wartość DateTime odzwierciedla datę i godzinę w innej niż lokalna strefa czasowa lub UTC, możesz przekonwertować ją na wartość DateTimeOffset i zachować informacje o strefie czasowej przez wywołanie przeciążonego konstruktora DateTimeOffset. Na przykład poniższy przykład tworzy instancję obiektu DateTimeOffset, który odzwierciedla standardowy czas środkowy.
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 {time1} {time1.Kind} to a DateTime value of {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
Drugi parametr tego przeciążenia konstruktora jest obiektem TimeSpan, który reprezentuje przesunięcie czasu od UTC. Pobierz go, wywołując metodę TimeZoneInfo.GetUtcOffset(DateTime) dla odpowiedniej strefy czasowej. Pojedynczy parametr metody to wartość DateTime reprezentująca datę i godzinę, która ma zostać przekonwertowana. Jeśli strefa czasowa obsługuje czas letni, ten parametr umożliwia metodzie określenie odpowiedniego przesunięcia dla tej konkretnej daty i godziny.
Konwersje z dateTimeOffset na DateTime
Właściwość DateTime jest najczęściej używana do konwersji z DateTimeOffset na DateTime. Zwraca jednak wartość DateTime, której właściwość Kind to Unspecified, jak pokazano w poniższym przykładzie:
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($"{sourceTime} converts to {targetTime} {targetTime.Kind}");
// Convert local time to DateTime value
sourceTime = new DateTimeOffset(baseTime,
TimeZoneInfo.Local.GetUtcOffset(baseTime));
targetTime = sourceTime.DateTime;
Console.WriteLine($"{sourceTime} converts to {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($"{sourceTime} converts to {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
W poprzednim przykładzie pokazano, że wszystkie informacje o relacji wartości DateTimeOffset z utc zostaną utracone przez konwersję, gdy zostanie użyta właściwość DateTime. To zachowanie ma również wpływ na wartości DateTimeOffset, które odpowiadają czasowi UTC lub czasowi lokalnemu systemu, ponieważ struktura DateTime odzwierciedla tylko te dwie strefy czasowe we właściwości Kind.
Aby zachować jak najwięcej informacji o strefie czasowej podczas konwertowania DateTimeOffset na wartość DateTime, można użyć właściwości DateTimeOffset.UtcDateTime i DateTimeOffset.LocalDateTime.
Konwertowanie godziny UTC
Aby wskazać, że przekonwertowana wartość DateTime to czas UTC, możesz pobrać wartość właściwości DateTimeOffset.UtcDateTime. Różni się ona od właściwości DateTime na dwa sposoby:
Jeśli wartość właściwości Offset nie jest równa TimeSpan.Zero, konwertuje czas na UTC.
Uwaga
Jeśli aplikacja wymaga, aby przekonwertowane wartości DateTime jednoznacznie zidentyfikowały pojedynczy punkt w czasie, należy rozważyć użycie właściwości DateTimeOffset.UtcDateTime do obsługi wszystkich konwersji DateTimeOffset na DateTime.
Poniższy kod używa właściwości UtcDateTime do konwertowania wartości DateTimeOffset, której przesunięcie jest równe TimeSpan.Zero, na wartość DateTime.
DateTimeOffset utcTime1 = new DateTimeOffset(2008, 6, 19, 7, 0, 0, TimeSpan.Zero);
DateTime utcTime2 = utcTime1.UtcDateTime;
Console.WriteLine($"{utcTime1} converted to {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
Poniższy kod używa właściwości UtcDateTime do przeprowadzenia konwersji strefy czasowej oraz konwersji typu wartości DateTimeOffset:
DateTimeOffset originalTime = new DateTimeOffset(2008, 6, 19, 7, 0, 0, new TimeSpan(5, 0, 0));
DateTime utcTime = originalTime.UtcDateTime;
Console.WriteLine($"{originalTime} converted to {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
Konwertowanie czasu lokalnego
Aby wskazać, że wartość DateTimeOffset reprezentuje czas lokalny, można przekazać wartość DateTime zwróconą przez właściwość DateTimeOffset.DateTime do metody static
(Shared
w języku Visual Basic SpecifyKind). Metoda zwraca datę i godzinę przekazaną do niej jako pierwszy parametr, ale ustawia właściwość Kind na wartość określoną przez jego drugi parametr. Poniższy kod używa metody SpecifyKind podczas konwertowania wartości DateTimeOffset, której przesunięcie odpowiada wartości lokalnej strefy czasowej:
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($"{utcTime1} converted to {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
Możesz również użyć właściwości DateTimeOffset.LocalDateTime, aby przekonwertować wartość DateTimeOffset na wartość DateTime lokalną. Właściwość Kind zwróconej wartości DateTime jest Local. Poniższy kod używa właściwości DateTimeOffset.LocalDateTime podczas konwertowania wartości DateTimeOffset, której przesunięcie odpowiada wartości lokalnej strefy czasowej:
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($"{localTime1} converted to {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
Po pobraniu wartości DateTime przy użyciu właściwości DateTimeOffset.LocalDateTime akcesor get
najpierw konwertuje wartość DateTimeOffset na UTC, a następnie konwertuje ją na czas lokalny, wywołując metodę ToLocalTime. To zachowanie oznacza, że można pobrać wartość z właściwości DateTimeOffset.LocalDateTime w celu przeprowadzenia konwersji strefy czasowej w tym samym czasie, w którym jest wykonywana konwersja typu. Oznacza to również, że lokalne reguły korekty strefy czasowej są stosowane podczas przeprowadzania konwersji. Poniższy kod ilustruje użycie właściwości DateTimeOffset.LocalDateTime do wykonania zarówno typu, jak i konwersji strefy czasowej. Przykładowe dane wyjściowe są przeznaczone dla maszyny ustawionej na strefę czasową Pacyfiku (STANY USA i Kanada). Data listopada to czas standardowy pacyficzny, czyli UTC-8, a data czerwca to czas letni, czyli UTC-7.
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($"{originalDate} converted to {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($"{originalDate} converted to {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
Metoda konwersji ogólnego przeznaczenia
W poniższym przykładzie zdefiniowano metodę o nazwie ConvertFromDateTimeOffset
, która konwertuje wartości DateTimeOffset na wartości DateTime. Na podstawie przesunięcia określa, czy wartość DateTimeOffset to czas UTC, czas lokalny, czy inny czas, i odpowiednio definiuje właściwość zwróconej wartości daty i czasu Kind.
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
W poniższym przykładzie wywołana jest metoda ConvertFromDateTimeOffset
, aby przekonwertować wartości DateTimeOffset reprezentujące czas UTC, czas lokalny i godzinę w strefie czasowej środkowej stanów Zjednoczonych.
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($"{utcTime} converted to {returnedDate} {returnedDate.Kind}");
// Convert local time
DateTimeOffset localTime = new DateTimeOffset(timeComponent,
TimeZoneInfo.Local.GetUtcOffset(timeComponent));
returnedDate = ConvertFromDateTimeOffset(localTime);
Console.WriteLine($"{localTime} converted to {returnedDate} {returnedDate.Kind}");
// Convert Central Standard Time
DateTimeOffset cstTime = new DateTimeOffset(timeComponent,
TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time").GetUtcOffset(timeComponent));
returnedDate = ConvertFromDateTimeOffset(cstTime);
Console.WriteLine($"{cstTime} converted to {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
Uwaga
Kod wykonuje następujące dwa założenia, w zależności od aplikacji i źródła jej wartości daty i godziny, może nie zawsze być prawidłowe:
Zakłada się, że wartość daty i godziny, której przesunięcie wynosi TimeSpan.Zero, reprezentuje UTC. W rzeczywistości czas UTC nie jest czasem w określonej strefie czasowej, lecz czasem, w odniesieniu do którego strefy czasowe na świecie są standaryzowane. Strefy czasowe mogą również mieć przesunięcie Zero.
Przyjęto założenie, że data i godzina, której przesunięcie odpowiada wartości lokalnej strefy czasowej, reprezentuje lokalną strefę czasową. Ponieważ wartości daty i godziny nie są skojarzone z ich oryginalną strefą czasową, może to nie być tak. data i godzina mogą pochodzić z innej strefy czasowej z tym samym przesunięciem.