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 saati, örneğin bir saat diliminin gün ışığından standart saatine geçiş sırasında olduğu gibi zamanda geri ayarlandığında oluşur. 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 konuda, saat diliminin standart saatini temsil ettiğini varsayarak belirsiz bir saatin nasıl çözüleceğini 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. Saat belirsizse, saat diliminin BaseUtcOffset özelliği tarafından döndürülen nesneden TimeSpan saat çıkarın.

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

Ö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 DateTime belirsiz olup olmadığını belirleyen adlı ResolveAmbiguousTime 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 saat, belirsiz saatin olası UTC uzaklıklarını içeren bir nesne dizisi TimeSpan almak için yöntemi çağrılarak GetAmbiguousTimeOffsets 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.

Kod derleme

Bu örnek şunları gerektirir:

  • Ad alanının System deyimiyle içeri aktarılması ( using C# kodunda gereklidir).

Ayrıca bkz.