Anvisningar: Lösa tvetydiga tider
En tvetydig tid är en tid som mappar till mer än en samordnad universell tid (UTC). Det inträffar när klocktiden justeras tillbaka i tiden, till exempel under övergången från en tidszons sommartid till dess standardtid. När du hanterar en tvetydig tid kan du göra något av följande:
Gör ett antagande om hur tiden mappar till UTC. Du kan till exempel anta att en tvetydig tid alltid uttrycks i tidszonens standardtid.
Om den tvetydiga tiden är ett dataobjekt som användaren anger kan du låta användaren lösa tvetydigheten.
Det här avsnittet visar hur du löser en tvetydig tid genom att anta att den representerar tidszonens standardtid.
Mappa en tvetydig tid till en tidszons standardtid
IsAmbiguousTime Anropa metoden för att avgöra om tiden är tvetydig.
Om tiden är tvetydig subtraherar du tiden från objektet TimeSpan som returneras av tidszonens BaseUtcOffset egenskap.
static
Anropa metoden (Shared
i Visual Basic .NET) SpecifyKind för att ange utc-datum- och tidsvärdets Kind egenskap till DateTimeKind.Utc.
Exempel
I följande exempel visas hur du konverterar en tvetydig tid till UTC genom att anta att den representerar den lokala tidszonens standardtid.
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
Exemplet består av en metod med namnet ResolveAmbiguousTime
som avgör om värdet DateTime som skickas till det är tvetydigt. Om värdet är tvetydigt returnerar metoden ett DateTime värde som representerar motsvarande UTC-tid. Metoden hanterar den här konverteringen genom att subtrahera värdet för den lokala tidszonens BaseUtcOffset egenskap från den lokala tiden.
Normalt hanteras en tvetydig tid genom att anropa GetAmbiguousTimeOffsets metoden för att hämta en matris med TimeSpan objekt som innehåller den tvetydiga tidens möjliga UTC-förskjutningar. Det här exemplet gör dock det godtyckliga antagandet att en tvetydig tid alltid ska mappas till tidszonens standardtid. Egenskapen BaseUtcOffset returnerar förskjutningen mellan UTC och en tidszons standardtid.
I det här exemplet görs alla referenser till den lokala tidszonen TimeZoneInfo.Local via egenskapen. Den lokala tidszonen tilldelas aldrig till en objektvariabel. Detta är en rekommenderad metod eftersom ett anrop till TimeZoneInfo.ClearCachedData metoden ogiltigförklarar alla objekt som den lokala tidszonen har tilldelats till.