Útmutató: Kétértelmű időpontok feloldása
A kétértelmű idő egy olyan idő, amely egynél több koordinált egyetemes időpontra (UTC) van leképezve. Ez akkor fordul elő, ha az idő vissza van állítva az időben, például az időzóna nyári időszámításáról a téli időszámításra való áttérés során. Ha kétértelmű időt kezel, az alábbiak egyikét teheti meg:
Tegyük fel, hogy az idő utc-ra van leképzve. Tegyük fel például, hogy a kétértelmű idő mindig az időzóna standard idejében van kifejezve.
Ha a kétértelmű idő a felhasználó által megadott adatelem, a kétértelműség feloldásához a felhasználóra hagyhatja.
Ez a témakör bemutatja, hogyan oldhat fel kétértelmű időt úgy, hogy feltételezi, hogy az az időzóna alapidejét jelöli.
Kétértelmű idő leképezése egy időzóna alapidejének megfelelően
Hívja meg a IsAmbiguousTime metódust annak megállapításához, hogy az idő nem egyértelmű-e.
Ha az idő nem egyértelmű, kivonja az időt az TimeSpan időzóna tulajdonsága BaseUtcOffset által visszaadott objektumból.
Hívja meg a
static
(Shared
Visual Basic .NET-ben) SpecifyKind metódust az UTC dátum- és időértékének Kind beállításához DateTimeKind.Utc.
Példa
Az alábbi példa bemutatja, hogyan alakíthat át kétértelmű időt UTC-vé azzal a feltételezéssel, hogy az a helyi időzóna szabványos idejét jelöli.
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
A példa egy nevesített ResolveAmbiguousTime
metódusból áll, amely meghatározza, hogy a DateTime neki átadott érték nem egyértelmű-e. Ha az érték nem egyértelmű, a metódus egy DateTime értéket ad vissza, amely a megfelelő UTC-időt jelöli. A metódus úgy kezeli ezt az átalakítást, hogy kivonja a helyi időzóna tulajdonságának BaseUtcOffset értékét a helyi időből.
Általában a kétértelmű időt úgy kezeli a rendszer, hogy meghívja a GetAmbiguousTimeOffsets metódust egy olyan objektumtömb lekérésére TimeSpan , amely a nem egyértelmű idő lehetséges UTC-eltolásait tartalmazza. Ez a példa azonban azt az önkényes feltételezést teszi lehetővé, hogy egy félreérthető időt mindig az időzóna alapidejének kell megfeleltetnie. A BaseUtcOffset tulajdonság az UTC és az időzóna szokásos ideje közötti eltolást adja vissza.
Ebben a példában a helyi időzónára mutató összes hivatkozás a TimeZoneInfo.Local tulajdonságon keresztül történik; a helyi időzóna soha nem lesz hozzárendelve objektumváltozóhoz. Ez ajánlott eljárás, mert a TimeZoneInfo.ClearCachedData metódus hívása érvényteleníti a helyi időzóna által hozzárendelt objektumokat.