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
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
Menghitung objek individual TimeZoneInfo dalam koleksi dengan menggunakan perulangan
foreach
(dalam C#) atauFor Each
...Next
perulangan (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
Panggil TimeZoneInfo.GetSystemTimeZones metode. Metode mengembalikan ReadOnlyCollection<T> kumpulan TimeZoneInfo objek generik.
Tetapkan koleksi yang dikembalikan di langkah 1 ke
DataSource
properti formulir Windows atau kontrol daftar ASP.NET.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:
Bahwa namespace layanan berikut diimpor:
System (dalam kode C#)