Saya mencoba membuat unit test untuk menguji kasus ketika zona waktu berubah pada mesin karena telah diatur secara tidak benar dan kemudian diperbaiki.
Dalam pengujian saya harus dapat membuat objek DateTime di zona waktu tidak ada lokal untuk memastikan bahwa orang yang menjalankan tes dapat melakukannya dengan sukses terlepas dari di mana mereka berada.
Dari apa yang dapat saya lihat dari konstruktor DateTime saya dapat mengatur TimeZone menjadi zona waktu lokal, zona waktu UTC atau tidak ditentukan.
Bagaimana cara membuat DateTime dengan zona waktu tertentu seperti PST?
Jawaban:
Jawaban Jon berbicara tentang TimeZone , tapi saya sarankan menggunakan TimeZoneInfo sebagai gantinya.
Secara pribadi saya suka menyimpan barang-barang di UTC jika memungkinkan (setidaknya untuk masa lalu; menyimpan UTC untuk masa depan memiliki masalah potensial ), jadi saya sarankan struktur seperti ini:
Anda mungkin ingin mengubah nama "TimeZone" menjadi "TimeZoneInfo" agar lebih jelas - saya lebih suka nama yang lebih singkat.
sumber
Struktur DateTimeOffset dibuat untuk jenis penggunaan yang tepat ini.
Lihat: http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
Berikut adalah contoh membuat objek DateTimeOffset dengan zona waktu tertentu:
DateTimeOffset do1 = new DateTimeOffset(2008, 8, 22, 1, 0, 0, new TimeSpan(-5, 0, 0));
sumber
Jawaban lain di sini bermanfaat tetapi tidak mencakup cara mengakses Pasifik secara khusus - ini dia:
Anehnya, walaupun "Waktu Standar Pasifik" biasanya berarti sesuatu yang berbeda dari "Waktu Siang Pasifik", dalam hal ini mengacu pada waktu Pasifik secara umum. Bahkan, jika Anda menggunakannya
FindSystemTimeZoneById
untuk mengambilnya, salah satu properti yang tersedia adalah bool yang memberi tahu Anda apakah zona waktu saat ini dalam penghematan siang hari atau tidak.Anda dapat melihat lebih banyak contoh umum ini di perpustakaan yang akhirnya saya lempar bersama untuk menangani DateTimes yang saya butuhkan di Zona Waktu berbeda berdasarkan dari mana pengguna meminta, dll:
https://github.com/b9chris/TimeZoneInfoLib.Net
Ini tidak akan berfungsi di luar Windows (misalnya Mono di Linux) karena daftar waktu berasal dari Windows Registry:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\
Di bawahnya Anda akan menemukan kunci (ikon folder di Peninjau Suntingan Registri); nama kunci-kunci itulah yang Anda gunakan
FindSystemTimeZoneById
. Di Linux, Anda harus menggunakan satu set definisi zona waktu standar Linux yang terpisah, yang saya belum cukup jelajahi.sumber
Saya mengubah sedikit jawaban Jon Skeet untuk web dengan metode ekstensi. Ini juga berfungsi pada biru seperti pesona.
sumber
Anda harus membuat objek khusus untuk itu. Objek khusus Anda akan berisi dua nilai:
Tidak yakin apakah sudah ada tipe data yang disediakan CLR yang memilikinya, tetapi setidaknya komponen TimeZone sudah tersedia.
sumber
Saya suka jawaban Jon Skeet, tetapi ingin menambahkan satu hal. Saya tidak yakin apakah Jon mengharapkan ctor untuk selalu dilewati di zona waktu lokal. Tapi saya ingin menggunakannya untuk kasus-kasus di mana itu sesuatu yang lain daripada lokal
Saya membaca nilai dari basis data, dan saya tahu zona waktu tempat basis data itu. Jadi di ctor, saya akan melewati zona waktu dari basis data. Tapi kemudian saya ingin nilai waktu setempat. LocalTime Jon tidak mengembalikan tanggal asli yang dikonversi menjadi tanggal zona waktu lokal. Ini mengembalikan tanggal yang dikonversi ke zona waktu asli (apa pun yang Anda berikan ke ctor).
Saya pikir nama-nama properti ini membersihkannya ...
sumber
Menggunakan kelas TimeZones memudahkan untuk membuat tanggal khusus zona waktu.
sumber