Ini pertanyaan yang bagus. Saya menghidupkannya kembali untuk memberikan sedikit detail tentang bagaimana .Net berperilaku dengan Kindnilai yang berbeda . Seperti yang ditunjukkan oleh @Jan Zich, Ini sebenarnya properti yang sangat penting dan diatur secara berbeda tergantung pada apakah Anda menggunakan Nowatau UtcNow.
Secara internal tanggal disimpan sebagai Ticks(berbeda dengan jawaban @Carl Camera) berbeda tergantung pada apakah Anda menggunakan Nowatau UtcNow.
DateTime.UtcNowberperilaku seperti bahasa lain. Ini ditetapkan Tickske nilai berdasarkan GMT. Ini juga diatur Kindke Utc.
DateTime.Nowmengubah Ticksnilai menjadi seperti apa jadinya waktu Anda di zona waktu GMT . Ini juga diatur Kindke Local.
Jika Anda 6 jam di belakang (GMT-6), Anda akan mendapatkan waktu GMT dari 6 jam yang lalu. Net sebenarnya mengabaikan Kinddan memperlakukan kali ini seolah-olah itu 6 jam yang lalu, meskipun itu seharusnya "sekarang". Hal ini semakin terpecah jika Anda membuat DateTimeinstance 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 Timespanseharusnya 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 Kindtidak 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 DateTimebenda - 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.