Bagikan melalui


Panduan: Menghitung zona waktu yang ada di komputer

Berhasil bekerja dengan zona waktu yang ditentukan mengharuskan informasi tentang zona waktu tersebut tersedia untuk sistem. Sistem operasi Windows XP dan Windows Vista menyimpan informasi ini di registri. Namun, meskipun jumlah total zona waktu yang ada di seluruh dunia adalah besar, registri hanya berisi informasi tentang subsetnya. Selain itu, registri itu sendiri adalah struktur dinamis yang isinya dapat mengalami perubahan yang disengaja dan tidak disengaja. Akibatnya, aplikasi tidak selalu dapat berasumsi bahwa zona waktu tertentu ditentukan dan tersedia pada sistem. Langkah pertama untuk banyak aplikasi yang menggunakan aplikasi informasi zona waktu adalah menentukan apakah zona waktu yang diperlukan tersedia di sistem lokal, atau untuk memberi pengguna daftar zona waktu untuk dipilih. Ini mengharuskan aplikasi menghitung zona waktu yang ditentukan pada sistem lokal.

Catatan

Jika aplikasi bergantung pada keberadaan zona waktu tertentu yang mungkin tidak ditentukan pada sistem lokal, aplikasi dapat memastikan keberadaannya dengan menserialisasikan dan mendeserialisasi informasi tentang zona waktu. Zona waktu kemudian dapat ditambahkan ke kontrol daftar sehingga pengguna aplikasi dapat memilihnya. Untuk detailnya, lihat Cara: Menyimpan Zona Waktu ke Sumber Daya Tersemat dan Cara: Memulihkan zona waktu dari sumber daya yang disematkan.

Untuk menghitung zona waktu yang ada pada sistem lokal

  1. Panggil TimeZoneInfo.GetSystemTimeZones metode. Metode mengembalikan ReadOnlyCollection<T> kumpulan TimeZoneInfo objek generik. Entri dalam koleksi diurutkan menurut DisplayName propertinya. Contohnya:

    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo) = TimeZoneInfo.GetSystemTimeZones
    
  2. Menghitung objek individual TimeZoneInfo dalam koleksi dengan menggunakan perulangan foreach (dalam C#) atau For Each...Nextperulangan (dalam Visual Basic), dan lakukan pemrosesan yang diperlukan pada setiap objek. Misalnya, kode berikut menghitung ReadOnlyCollection<T> pengumpulan TimeZoneInfo objek yang dikembalikan di langkah 1 dan mencantumkan nama tampilan setiap zona waktu di konsol.

    foreach (TimeZoneInfo timeZone in tzCollection)
        Console.WriteLine($"   {timeZone.Id}: {timeZone.DisplayName}");
    
    For Each timeZone As TimeZoneInfo In tzCollection
        Console.WriteLine("   {0}: {1}", timeZone.Id, timeZone.DisplayName)
    Next
    

Untuk menyajikan pengguna dengan daftar zona waktu yang ada di sistem lokal

  1. Panggil TimeZoneInfo.GetSystemTimeZones metode. Metode mengembalikan ReadOnlyCollection<T> kumpulan TimeZoneInfo objek generik.

  2. Tetapkan koleksi yang dikembalikan di langkah 1 ke DataSource properti formulir Windows atau kontrol daftar ASP.NET.

  3. Ambil TimeZoneInfo objek yang telah dipilih pengguna.

Contohnya memberikan ilustrasi untuk aplikasi Windows.

Contoh

Contoh memulai aplikasi Windows yang menampilkan zona waktu yang ditentukan pada sistem dalam kotak daftar. Contoh kemudian menampilkan kotak dialog yang berisi nilai DisplayName properti objek zona waktu yang dipilih oleh pengguna.

private void Form1_Load(object sender, EventArgs e)
{
    ReadOnlyCollection<TimeZoneInfo> tzCollection;
    tzCollection = TimeZoneInfo.GetSystemTimeZones();
    _timeZoneList.DataSource = tzCollection;
}

private void OkButton_Click(object sender, EventArgs e)
{
    TimeZoneInfo? selectedTimeZone = (TimeZoneInfo?)_timeZoneList.SelectedItem;
    MessageBox.Show($"You selected the {selectedTimeZone?.ToString()} time zone.");
}
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim tzCollection As ReadOnlyCollection(Of TimeZoneInfo)
    tzCollection = TimeZoneInfo.GetSystemTimeZones()
    Me.timeZoneList.DataSource = tzCollection
End Sub

Private Sub OkButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OkButton.Click
    Dim selectedTimeZone As TimeZoneInfo = DirectCast(Me.timeZoneList.SelectedItem(), TimeZoneInfo)
    MsgBox("You selected the " & selectedTimeZone.ToString() & " time zone.")
End Sub

Sebagian besar kontrol daftar (seperti System.Windows.Forms.ListBox kontrol atau System.Web.UI.WebControls.BulletedList ) memungkinkan Anda menetapkan koleksi variabel objek ke propertinya DataSource selama koleksi tersebut IEnumerable mengimplementasikan antarmuka. (Kelas generik ReadOnlyCollection<T> melakukan ini.) Untuk menampilkan objek individual dalam koleksi, kontrol memanggil metode objek ToString tersebut untuk mengekstrak string yang digunakan untuk mewakili objek. Dalam hal TimeZoneInfo objek, ToString metode mengembalikan TimeZoneInfo nama tampilan objek (nilai propertinya DisplayName ).

Catatan

Karena kontrol daftar memanggil metode objek ToString, Anda dapat menetapkan kumpulan TimeZoneInfo objek ke kontrol, memiliki kontrol yang menampilkan nama yang bermakna untuk setiap objek, dan mengambil TimeZoneInfo objek yang telah dipilih pengguna. Ini menghilangkan kebutuhan untuk mengekstrak string untuk setiap objek dalam koleksi, menetapkan string ke koleksi yang pada gilirannya ditetapkan ke properti kontrol DataSource, mengambil string yang telah dipilih pengguna, lalu gunakan string ini untuk mengekstrak objek yang dijelaskannya.

Mengompilasi kode

Contoh ini membutuhkan:

Lihat juga