Ini pertanyaan yang bagus. Saya menghidupkannya kembali untuk memberikan sedikit detail tentang bagaimana .Net berperilaku dengan Kind
nilai yang berbeda . Seperti yang ditunjukkan oleh @Jan Zich, Ini sebenarnya properti yang sangat penting dan diatur secara berbeda tergantung pada apakah Anda menggunakan Now
atau UtcNow
.
Secara internal tanggal disimpan sebagai Ticks
(berbeda dengan jawaban @Carl Camera) berbeda tergantung pada apakah Anda menggunakan Now
atau UtcNow
.
DateTime.UtcNow
berperilaku seperti bahasa lain. Ini ditetapkan Ticks
ke nilai berdasarkan GMT. Ini juga diatur Kind
ke Utc
.
DateTime.Now
mengubah Ticks
nilai menjadi seperti apa jadinya waktu Anda di zona waktu GMT . Ini juga diatur Kind
ke Local
.
Jika Anda 6 jam di belakang (GMT-6), Anda akan mendapatkan waktu GMT dari 6 jam yang lalu. Net sebenarnya mengabaikan Kind
dan memperlakukan kali ini seolah-olah itu 6 jam yang lalu, meskipun itu seharusnya "sekarang". Hal ini semakin terpecah jika Anda membuat DateTime
instance lalu mengubah zona waktu Anda dan mencoba menggunakannya.
Contoh DateTime dengan nilai 'Jenis' yang berbeda TIDAK kompatibel.
Mari kita lihat beberapa kode ...
DateTime utc = DateTime.UtcNow;
DateTime now = DateTime.Now;
Debug.Log (utc + " " + utc.Kind); // 05/20/2015 17:19:27 Utc
Debug.Log (now + " " + now.Kind); // 05/20/2015 10:19:27 Local
Debug.Log (utc.Ticks); // 635677391678617830
Debug.Log (now.Ticks); // 635677139678617840
now = now.AddHours(1);
TimeSpan diff = utc - now;
Debug.Log (diff); // 05:59:59.9999990
Debug.Log (utc < now); // false
Debug.Log (utc == now); // false
Debug.Log (utc > now); // true
Debug.Log (utc.ToUniversalTime() < now.ToUniversalTime()); // true
Debug.Log (utc.ToUniversalTime() == now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() > now.ToUniversalTime()); // false
Debug.Log (utc.ToUniversalTime() - now.ToUniversalTime()); // -01:00:00.0000010
Seperti yang dapat Anda lihat di sini, perbandingan dan fungsi matematika tidak secara otomatis dikonversi ke waktu yang kompatibel. The Timespan
seharusnya hampir satu jam, melainkan hampir 6. "utc <sekarang" seharusnya benar (Aku bahkan menambahkan satu jam untuk memastikan), tapi masih palsu.
Anda juga dapat melihat 'bekerja di sekitar' yang hanya mengkonversi ke waktu universal di mana saja yang Kind
tidak sama.
Jawaban langsung saya atas pertanyaan tersebut setuju dengan rekomendasi jawaban yang diterima tentang kapan harus menggunakan masing-masing. Anda harus selalu mencoba untuk bekerja dengan DateTime
benda - benda yang ada Kind=Utc
, kecuali selama i / o (displaying dan parsing). Ini berarti Anda harus hampir selalu menggunakan DateTime.UtcNow
, kecuali untuk kasus di mana Anda membuat objek hanya untuk menampilkannya, dan segera membuangnya.