Sdílet prostřednictvím


Postupy: Vyřešit nejednoznačné časy

Nejednoznačný čas je čas, který je mapován na více než jeden koordinovaný světový čas (standard UTC). K tomu dojde, když je čas se upraven směrem zpět, například při přechodu z letního času na standardní čas. Při zpracování nejednoznačného času můžete provést jedno z následujících:

  • Zkontrolujte předpoklady o tom, jak je čas mapován na čas UTC. Předpokládejme například, že nejednoznačný čas je vždy vyjádřen ve standardním času časového pásma.

  • Pokud je nejednoznačný čas položkou dat zadaných uživatelem, můžete vyřešení nejednoznačnosti ponechat na uživateli.

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

Chcete-li namapovat nejednoznačný čas na standardní čas časového pásma

  1. Volejte metodu IsAmbiguousTime pro zjištění, zda je čas nejednoznačný.

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

  3. Volejte metodu static (Shared v jazyce Visual Basic .NET) SpecifyKind pro nastavení vlastnosti Kind hodnoty data a času UTC na DateTimeKind.Utc.

Příklad

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

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
private 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;            
   }   
}

V příkladu je obsažena metoda s názvem ResolveAmbiguousTime určující, zda je hodnota DateTime, která jí je předána, nejednoznačná. Pokud je hodnota nejednoznačná, metoda vrátí hodnotu DateTime, která představuje odpovídající čas standardu UTC. Metoda zpracovává tento převod pomocí odečtení hodnoty vlastnosti BaseUtcOffset místního časového pásma od místního času.

Obvykle je nejednoznačný čas zpracováván pomocí volání metody GetAmbiguousTimeOffsets pro načítání pole objektů TimeSpan, které obsahují možné posuny nejednoznačného času od času UTC. V tomto příkladu je však učiněn dodatečný předpoklad, že nejednoznačný čas by měl být vždy namapován na standardní čas časového pásma. Vlastnost BaseUtcOffset vrací posun mezi časem standardu UTC a standardním časem časového pásma.

V tomto příkladu jsou všechny odkazy na místní časové pásmo provedeny pomocí vlastnosti TimeZoneInfo.Local. Místní časové pásmo není nikdy přiřazeno proměnné objektu. Toto je doporučenou praxí, protože volání metody TimeZoneInfo.ClearCachedData zruší platnost objektů, ke kterým je přiřazeno místní časové pásmo.

Probíhá kompilace kódu

Tento příklad vyžaduje:

  • Že bude do projektu přidán odkaz na System.Core.dll.

  • Že obor názvů System bude importován příkazem using (povinné v kódu jazyka C#).

Viz také

Úkoly

Postupy: Rozpoznání nejednoznačných časů uživatelem

Další zdroje

Data, časy a časových pásem