Dela via


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

  1. IsAmbiguousTime Anropa metoden för att avgöra om tiden är tvetydig.

  2. Om tiden är tvetydig subtraherar du tiden från objektet TimeSpan som returneras av tidszonens BaseUtcOffset egenskap.

  3. 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.

Kompilera koden

Det här exemplet kräver:

  • System Att namnområdet importeras med -instruktionen using (krävs i C#-kod).

Se även