Sdílet prostřednictvím


Postupy: Řešení nejednoznačných časových údajů

Nejednoznačný čas je čas, který se mapuje na více než jeden koordinovaný univerzální čas (UTC). Dochází k tomu, když se hodinový čas upraví zpět v čase, například při přechodu z letního času časového pásma na standardní čas. Při zpracování nejednoznačné doby můžete udělat jednu z těchto věcí:

  • Představte si, jak se čas mapuje na UTC. Můžete například předpokládat, že nejednoznačný čas se vždy vyjadřuje ve standardním čase časového pásma.

  • Pokud nejednoznačný čas představuje položku dat zadaná uživatelem, můžete ji nechat uživateli, aby přeložil nejednoznačnost.

Toto téma ukazuje, jak vyřešit nejednoznačný čas za předpokladu, že představuje standardní čas časového pásma.

Mapování nejednoznačného času na standardní čas časového pásma

  1. IsAmbiguousTime Voláním metody určete, zda je čas nejednoznačný.

  2. Pokud je čas nejednoznačný, odečtěte čas od objektu TimeSpan vráceného vlastností časového pásma BaseUtcOffset .

  3. static Volání metody (Shared v jazyce Visual Basic .NET) SpecifyKind k nastavení vlastnosti hodnoty Kind data a času UTC na DateTimeKind.Utc.

Příklad

Následující příklad ukazuje, jak převést nejednoznačný čas na UTC za předpokladu, že představuje standardní čas místního časového pásma.

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

Příklad se skládá z metody s názvem ResolveAmbiguousTime , která určuje, zda DateTime je hodnota předaná nejednoznačný. Pokud je hodnota nejednoznačná, metoda vrátí DateTime hodnotu, která představuje odpovídající čas UTC. Metoda tento převod zpracovává odečtením hodnoty vlastnosti místního časového pásma BaseUtcOffset z místního času.

Obvykle se nejednoznačný čas zpracovává voláním GetAmbiguousTimeOffsets metody pro načtení pole TimeSpan objektů, které obsahují nejednoznačné časové posuny UTC. Tento příklad ale předpokládá, že nejednoznačný čas by měl být vždy mapován na standardní čas časového pásma. Vlastnost BaseUtcOffset vrátí posun mezi standardem UTC a standardním časem časového pásma.

V tomto příkladu jsou všechny odkazy na místní časové pásmo provedeny prostřednictvím TimeZoneInfo.Local vlastnosti; místní časové pásmo není nikdy přiřazeno k proměnné objektu. Toto je doporučený postup, protože volání TimeZoneInfo.ClearCachedData metody zneplatňuje všechny objekty, ke kterým je přiřazeno místní časové pásmo.

Viz také