Apakah DateTime .Net berisi informasi tentang zona waktu tempat dibuat?
Saya memiliki pustaka yang mengurai DateTime dari format yang memiliki "+ zz" di bagian akhir, dan sementara itu mem-parsing dengan benar dan menyesuaikan waktu lokal, saya perlu mengetahui zona waktu tertentu dari objek DateTime.
Apakah ini mungkin? Yang bisa saya lihat adalah DateTime.Kind, yang menentukan apakah waktunya lokal atau UTC.
Jawaban:
DateTime sendiri tidak berisi informasi zona waktu nyata. Ini mungkin tahu apakah itu UTC atau lokal, tetapi bukan apa arti lokal sebenarnya.
DateTimeOffset agak lebih baik - pada dasarnya itu adalah waktu UTC dan offset. Namun, itu masih belum cukup untuk menentukan zona waktu, karena banyak zona waktu yang berbeda dapat memiliki offset yang sama pada satu titik waktu. Ini kedengarannya mungkin cukup baik untuk Anda, karena semua yang harus Anda kerjakan saat mengurai tanggal / waktu adalah offsetnya.
Dukungan untuk zona waktu mulai .NET 3.5 jauh lebih baik daripada sebelumnya, tetapi saya benar-benar ingin melihat "ZonedDateTime" standar atau sesuatu seperti itu - waktu UTC dan zona waktu aktual. Mudah untuk membuat sendiri, tetapi akan menyenangkan melihatnya di pustaka standar.
EDIT: Hampir empat tahun kemudian, saya sekarang menyarankan untuk menggunakan Noda Time yang memiliki jenis tanggal / waktu yang lebih kaya. Saya bias, sebagai penulis utama Noda Time :)
sumber
Tidak.
Kutipan dari artikel yang sangat bagus di sini . A harus membaca untuk setiap pengembang .Net.
Jadi saran saya adalah menulis kelas pembungkus kecil yang sesuai dengan kebutuhan Anda.
sumber
Ada perpustakaan TimeZone domain publik untuk .NET . Sangat berguna. Ini akan menjawab kebutuhan Anda.
Memecahkan masalah zona waktu kasus umum lebih sulit dari yang Anda pikirkan.
sumber
Anda dapat menggunakan kelas TimeZoneInfo
Kelas TimeZone mengenali zona waktu lokal, dan dapat mengonversi waktu antara Waktu Universal Terkoordinasi (UTC) dan waktu lokal. Objek TimeZoneInfo dapat mewakili zona waktu apa pun, dan metode kelas TimeZoneInfo dapat digunakan untuk mengonversi waktu dalam satu zona waktu ke waktu yang sesuai di zona waktu lain. Anggota kelas TimeZoneInfo mendukung operasi berikut:
Mengambil zona waktu yang sudah ditentukan oleh sistem operasi.
Menghitung zona waktu yang tersedia di sistem.
Mengonversi waktu antara zona waktu yang berbeda.
Membuat zona waktu baru yang belum ditentukan oleh sistem operasi.
Serialisasi zona waktu untuk pengambilan nanti.
sumber
Dari API ( http://msdn.microsoft.com/en-us/library/system.datetime_members(VS.71).aspx ) sepertinya tidak bisa menampilkan nama zona waktu yang digunakan.
sumber
Umumnya praktiknya adalah meneruskan data sebagai DateTime dengan "zona waktu" UTC dan kemudian meneruskan objek TimeZoneInfo dan ketika Anda siap untuk menampilkan data, Anda menggunakan objek TimeZoneInfo untuk mengonversi DateTime UTC.
Pilihan lainnya adalah untuk mengatur DateTime dengan zona waktu saat ini, dan kemudian memastikan "zona waktu" tidak diketahui untuk objek DateTime, kemudian pastikan DateTime lagi diteruskan dengan TimeZoneInfo yang menunjukkan TimeZone dari DateTime berlalu.
Seperti yang telah ditunjukkan orang lain di sini, alangkah baiknya jika Microsoft mengatasi ini dan membuat satu objek bagus untuk melakukan semuanya, tetapi untuk saat ini Anda harus berurusan dengan dua objek.
sumber
DateTime tidak mengetahui perbedaan zona waktunya. Tidak ada metode bawaan untuk mengembalikan offset atau nama zona waktu (mis. EAT, CEST, EST, dll).
Seperti yang disarankan oleh orang lain, Anda dapat mengubah tanggal Anda menjadi UTC:
dan kemudian hanya menghitung perbedaannya:
Anda juga dapat mengonversi satu waktu ke waktu lainnya dengan menggunakan DateTimeOffset:
Tapi ini semacam kompresi lossy - offset saja tidak dapat memberi tahu Anda zona waktunya karena dua negara yang berbeda mungkin berada dalam zona waktu yang berbeda dan memiliki waktu yang sama hanya untuk sebagian tahun (mis. Afrika Selatan dan Eropa). Selain itu, ketahuilah bahwa waktu musim panas mungkin berlaku pada tanggal yang berbeda (EST vs CET - perbedaan 3 minggu).
Anda bisa mendapatkan nama zona waktu sistem lokal Anda menggunakan kelas TimeZoneInfo:
Saya setuju dengan Gerrie Schenck, silakan baca artikel yang dia sarankan.
sumber