Nasıl yapılır: Belirsiz saatleri çözme

Belirsiz bir saat, birden fazla Eşgüdümlü Evrensel Saat 'e (UTC) eşlenen bir zamandır. Saat ayarı, bir saat diliminin yaz saatinden standart saatine geçişi sırasında olduğu gibi, geri alındığında gerçekleşir. Belirsiz bir zamanı işlerken aşağıdakilerden birini yapabilirsiniz:

  • Saatin UTC'ye nasıl eş olduğu hakkında bir varsayımda bulunın. Örneğin, belirsiz bir saatin her zaman saat diliminin standart saatinde ifade edildiği varsayılabilir.

  • Belirsiz saat, kullanıcının girdiği bir veri öğesiyse, belirsizliği çözmek için bunu kullanıcıya bırakabilirsiniz.

Bu konu, bir belirsiz zamanı, saat diliminin standart zamanını temsil ettiğini varsayarak nasıl çözeceğinizi gösterir.

Belirsiz bir saati bir saat diliminin standart saatiyle eşlemek için

  1. IsAmbiguousTime Saatin belirsiz olup olmadığını belirlemek için yöntemini çağırın.

  2. Eğer saat belirsizse, saat diliminin BaseUtcOffset özelliğinden döndürülen TimeSpan nesnesinden saati çıkartın.

  3. UTC tarih ve saat değerinin Kind özelliğini DateTimeKind.Utc olarak ayarlamak için static yöntemini (Shared Visual Basic .NET'te) çağırın.

Örnek

Aşağıdaki örnekte, yerel saat diliminin standart saatini temsil ettiği varsayılarak belirsiz bir saatin UTC'ye nasıl dönüştürüldüğü gösterilmektedir.

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

Örnek, ona geçirilen değerin ResolveAmbiguousTime belirsiz olup olmadığını belirleyen adlı DateTime bir yöntemden oluşur. Değer belirsizse, yöntemi karşılık gelen UTC saatini temsil eden bir DateTime değer döndürür. yöntemi, yerel saat dilimi BaseUtcOffset özelliğinin değerini yerel saatten çıkararak bu dönüştürmeyi işler.

Genellikle belirsiz bir zaman, belirsiz zamanın olası UTC sapmalarını içeren bir nesneler dizisini almak için GetAmbiguousTimeOffsets yöntemi çağrılarak TimeSpan işlenir. Ancak bu örnek, belirsiz bir saatin her zaman saat diliminin standart saatiyle eşlenmesi gerektiği şeklinde rastgele bir varsayımda bulunur. özelliği UTC BaseUtcOffset ile saat diliminin standart saati arasındaki uzaklığı döndürür.

Bu örnekte, yerel saat dilimine yapılan tüm başvurular özelliği aracılığıyla TimeZoneInfo.Local yapılır; yerel saat dilimi hiçbir zaman bir nesne değişkenine atanmamaktadır. Yöntemine yapılan bir çağrı, yerel saat diliminin TimeZoneInfo.ClearCachedData atandığı tüm nesneleri geçersiz kıldığından bu önerilen bir uygulamadır.

Ayrıca bkz.