Delen via


Procedure: Dubbelzinnige tijden oplossen

Een dubbelzinnige tijd is een tijd die is toegewezen aan meer dan één Coordinated Universal Time (UTC). Het gebeurt wanneer de kloktijd weer in de tijd wordt aangepast, zoals tijdens de overgang van de zomertijd van een tijdzone naar de standaardtijd. Wanneer u een dubbelzinnige tijd verwerkt, kunt u een van de volgende handelingen uitvoeren:

  • Maak een aanname over hoe de tijd wordt toegewezen aan UTC. U kunt er bijvoorbeeld van uitgaan dat een dubbelzinnige tijd altijd wordt uitgedrukt in de standaardtijd van de tijdzone.

  • Als de dubbelzinnige tijd een gegevensitem is dat door de gebruiker is ingevoerd, kunt u deze aan de gebruiker laten staan om de dubbelzinnigheid op te lossen.

In dit onderwerp wordt beschreven hoe u een dubbelzinnige tijd kunt oplossen door ervan uit te gaan dat deze de standaardtijd van de tijdzone vertegenwoordigt.

Een dubbelzinnige tijd toewijzen aan de standaardtijd van een tijdzone

  1. Roep de IsAmbiguousTime methode aan om te bepalen of de tijd dubbelzinnig is.

  2. Als de tijd dubbelzinnig is, trekt u de tijd af van het TimeSpan object dat wordt geretourneerd door de eigenschap van BaseUtcOffset de tijdzone.

  3. Roep de static methode (Shared in Visual Basic .NET) SpecifyKind aan om de eigenschap UTC-datum en tijd Kind in te stellen op DateTimeKind.Utc.

Opmerking

In het volgende voorbeeld ziet u hoe u een dubbelzinnige tijd converteert naar UTC door ervan uit te gaan dat deze de standaardtijd van de lokale tijdzone vertegenwoordigt.

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

Het voorbeeld bestaat uit een methode met de naam ResolveAmbiguousTime die bepaalt of de DateTime waarde die aan deze waarde is doorgegeven, dubbelzinnig is. Als de waarde niet eenduidig is, retourneert de methode een DateTime waarde die de bijbehorende UTC-tijd vertegenwoordigt. De methode verwerkt deze conversie door de waarde van de eigenschap van de lokale tijdzone BaseUtcOffset af te trekken van de lokale tijd.

Normaal gesproken wordt een dubbelzinnige tijd verwerkt door de GetAmbiguousTimeOffsets methode aan te roepen om een matrix met TimeSpan objecten op te halen die de mogelijke UTC-offsets van de tijd bevatten. In dit voorbeeld wordt echter de willekeurige veronderstelling gemaakt dat een dubbelzinnige tijd altijd moet worden toegewezen aan de standaardtijd van de tijdzone. De BaseUtcOffset eigenschap retourneert de verschuiving tussen UTC en de standaardtijd van een tijdzone.

In dit voorbeeld worden alle verwijzingen naar de lokale tijdzone gemaakt via de TimeZoneInfo.Local eigenschap. De lokale tijdzone wordt nooit toegewezen aan een objectvariabele. Dit is een aanbevolen procedure omdat een aanroep van de TimeZoneInfo.ClearCachedData methode alle objecten waaraan de lokale tijdzone is toegewezen, ongeldig maakt.

Zie ook