Bagikan melalui


Panduan: Mengatasi waktu yang ambigu

Waktu ambigu adalah waktu yang memetakan ke lebih dari satu Waktu Universal Terkoordinasi (UTC). Ini terjadi ketika waktu jam disesuaikan kembali dalam waktu, seperti selama transisi dari waktu musim panas zona waktu ke waktu standarnya. Saat menangani waktu yang ambigu, Anda dapat melakukan salah satu hal berikut:

  • Buat asumsi tentang bagaimana waktu memetakan ke UTC. Misalnya, Anda dapat mengasumsikan bahwa waktu ambigu selalu dinyatakan dalam waktu standar zona waktu.

  • Jika waktu ambigu adalah item data yang dimasukkan oleh pengguna, Anda dapat menyerahkannya kepada pengguna untuk menyelesaikan ambiguitas.

Topik ini menunjukkan cara mengatasi waktu yang ambigu dengan mengasumsikan bahwa topik tersebut mewakili waktu standar zona waktu.

Untuk memetakan waktu ambigu ke waktu standar zona waktu

  1. Panggil metode IsAmbiguousTime untuk menentukan apakah waktunya ambigu.

  2. Jika waktu ambigu, kurangi waktu dari objek TimeSpan yang dikembalikan oleh properti BaseUtcOffset zona waktu.

  3. Panggil static metode (Shared dalam Visual Basic .NET) SpecifyKind untuk mengatur properti nilai tanggal dan waktu Kind UTC ke DateTimeKind.Utc.

Contoh

Contoh berikut ini menggambarkan cara mengonversi waktu ambigu ke UTC dengan mengasumsikan bahwa itu mewakili waktu standar zona waktu lokal.

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

Contohnya terdiri dari sebuah metode bernama ResolveAmbiguousTime yang menentukan apakah nilai DateTime yang diteruskan ke metode tersebut ambigu. Jika nilainya ambigu, metode mengembalikan nilai DateTime yang mewakili waktu UTC yang sesuai. Metode menangani konversi ini dengan mengurangi nilai properti BaseUtcOffset zona waktu lokal dari waktu setempat.

Biasanya, waktu ambigu ditangani dengan memanggil metode GetAmbiguousTimeOffsets untuk mengambil array dari objek TimeSpan yang berisi kemungkinan offset UTC waktu ambigu. Namun, contoh ini membuat asumsi arbitrer bahwa waktu yang ambigu harus selalu dipetakan ke waktu standar zona waktu. Properti BaseUtcOffset mengembalikan offset antara UTC dan waktu standar zona waktu.

Dalam contoh ini, semua referensi ke zona waktu lokal dibuat melalui TimeZoneInfo.Local properti; zona waktu lokal tidak pernah ditetapkan ke variabel objek. Ini adalah praktik yang direkomendasikan karena panggilan ke metode TimeZoneInfo.ClearCachedData membatalkan objek apa pun yang ditetapkan zona waktu lokal.

Lihat juga