Instrukcje: Rozwiązywanie niejednoznacznych wartości czasu
Niejednoznaczny czas to czas, który mapuje na więcej niż jeden uniwersalny czas koordynowany (UTC). Występuje, gdy czas zegara jest dostosowywany z powrotem w czasie, na przykład podczas przejścia ze strefy czasowej czas letni do czasu standardowego. W przypadku obsługi niejednoznacznego czasu można wykonać jedną z następujących czynności:
Przyjmij założenie dotyczące sposobu mapowania czasu na czas UTC. Można na przykład założyć, że niejednoznaczny czas jest zawsze wyrażony w standardowym czasie strefy czasowej.
Jeśli niejednoznaczny czas jest elementem danych wprowadzonym przez użytkownika, możesz pozostawić go użytkownikowi, aby rozwiązać niejednoznaczność.
W tym temacie pokazano, jak rozwiązać niejednoznaczny czas, zakładając, że reprezentuje standardowy czas strefy czasowej.
Aby zamapować niejednoznaczny czas na czas standardowy strefy czasowej
Wywołaj metodę , IsAmbiguousTime aby określić, czy czas jest niejednoznaczny.
Jeśli czas jest niejednoznaczny, odejmij czas od TimeSpan obiektu zwróconego przez właściwość strefy czasowej BaseUtcOffset .
Wywołaj metodę
static
(Shared
w języku Visual Basic .NET), SpecifyKind aby ustawić właściwość wartości Kind daty i godziny UTC na DateTimeKind.Utcwartość .
Przykład
W poniższym przykładzie pokazano, jak przekonwertować niejednoznaczny czas na UTC, zakładając, że reprezentuje on czas standardowy lokalnej strefy czasowej.
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
Przykład składa się z metody o nazwie ResolveAmbiguousTime
, która określa, czy DateTime przekazana do niej wartość jest niejednoznaczna. Jeśli wartość jest niejednoznaczna, metoda zwraca wartość reprezentującą DateTime odpowiedni czas UTC. Metoda obsługuje tę konwersję, odejmując wartość właściwości lokalnej strefy czasowej BaseUtcOffset z czasu lokalnego.
Zazwyczaj obsługiwany jest niejednoznaczny czas przez wywołanie GetAmbiguousTimeOffsets metody w celu pobrania tablicy TimeSpan obiektów, które zawierają niejednoznaczne przesunięcia czasu UTC. Jednak ten przykład sprawia, że dowolne założenie, że niejednoznaczny czas powinien być zawsze mapowany na standardowy czas strefy czasowej. Właściwość BaseUtcOffset zwraca przesunięcie między godziną UTC a czasem standardowym strefy czasowej.
W tym przykładzie wszystkie odwołania do lokalnej strefy czasowej są wykonywane za pośrednictwem TimeZoneInfo.Local właściwości ; lokalna strefa czasowa nigdy nie jest przypisana do zmiennej obiektu. Jest to zalecana praktyka, ponieważ wywołanie TimeZoneInfo.ClearCachedData metody unieważnia wszystkie obiekty, do których przypisano lokalną strefę czasową.