Saya sudah bertanya-tanya apa sebenarnya prinsip-prinsip bagaimana kedua properti itu bekerja. Saya tahu yang kedua bersifat universal dan pada dasarnya tidak berurusan dengan zona waktu, tetapi bisakah seseorang menjelaskan secara rinci bagaimana mereka bekerja dan mana yang harus digunakan dalam skenario apa?
.net
language-features
date
Slavo
sumber
sumber
Jawaban:
DateTime.UtcNow memberi tahu Anda tanggal dan waktu seperti di Waktu Universal Terkoordinasi, yang juga disebut zona waktu Waktu Rata-rata Greenwich - pada dasarnya seperti jika Anda berada di London, Inggris, tetapi tidak selama musim panas. DateTime.Now memberikan tanggal dan waktu seperti yang akan muncul kepada seseorang di lokal Anda saat ini.
Saya sarankan menggunakan
DateTime.Now
setiap kali Anda menampilkan tanggal untuk seorang manusia - dengan cara itu mereka merasa nyaman dengan nilai yang mereka lihat - itu adalah sesuatu yang mereka dapat dengan mudah dibandingkan dengan apa yang mereka lihat di jam tangan atau jam mereka. GunakanDateTime.UtcNow
ketika Anda ingin menyimpan tanggal atau menggunakannya untuk perhitungan nanti seperti itu (dalam model client-server) perhitungan Anda tidak menjadi bingung oleh klien di zona waktu yang berbeda dari server Anda atau dari satu sama lain.sumber
Ini sangat sederhana, jadi saya pikir itu tergantung pada audiens Anda dan di mana mereka tinggal.
Jika Anda tidak menggunakan Utc, Anda harus mengetahui zona waktu orang yang Anda tampilkan tanggal dan waktunya - jika tidak, Anda akan memberi tahu mereka sesuatu terjadi pada jam 3 sore dalam waktu sistem atau server, ketika itu benar-benar terjadi pada jam 5 sore di mana mereka kebetulan hidup.
Kami menggunakan
DateTime.UtcNow
karena kami memiliki pemirsa web global, dan karena saya lebih suka tidak mengomel setiap pengguna untuk mengisi formulir yang menunjukkan zona waktu mereka tinggal.Kami juga menampilkan waktu relatif (2 jam yang lalu, 1 hari yang lalu, dll) sampai pos cukup umur sehingga waktunya "sama" di mana pun di Bumi Anda tinggal.
sumber
Perhatikan juga perbedaan kinerja;
DateTime.UtcNow
ada di suatu tempat sekitar 30 kali lebih cepatDateTime.Now
, karena secara internalDateTime.Now
melakukan banyak penyesuaian zona waktu (Anda dapat dengan mudah memverifikasi ini dengan Reflector).Jadi JANGAN gunakan
DateTime.Now
untuk pengukuran waktu relatif.sumber
Salah satu konsep utama untuk memahami di NET adalah bahwa sekarang adalah saat seluruh bumi tidak peduli apa zona waktu Anda berada di Jadi jika Anda memuat variabel dengan.
DateTime.Now
AtauDateTime.UtcNow
-. Penugasan identik * AndaDateTime
objek tahu apa TimeZone Anda berada di dan memperhitungkannya terlepas dari penugasannya.Kegunaan
DateTime.UtcNow
sangat berguna saat menghitung tanggal melintasi batas Waktu Daylight Savings. Artinya, di tempat-tempat yang berpartisipasi dalam penghematan waktu siang hari, kadang-kadang ada 25 jam dari siang sampai siang hari berikutnya, dan kadang-kadang ada 23 jam antara siang dan siang hari berikutnya. Jika Anda ingin menentukan dengan benar jumlah jam dari waktu A dan waktu B, Anda harus terlebih dahulu menerjemahkan masing-masing ke setara UTC mereka sebelum menghitungTimeSpan
.Ini dicakup oleh posting blog yang saya tulis yang menjelaskan lebih lanjut
TimeSpan
, dan termasuk tautan ke artikel MS yang bahkan lebih luas tentang topik tersebut.* Klarifikasi: Tugas mana pun akan menyimpan waktu saat ini. Jika Anda adalah untuk memuat dua variabel satu melalui
DateTime.Now()
dan lainnya melaluiDateTime.UtcNow()
paraTimeSpan
perbedaan antara dua akan milidetik, bukan jam dengan asumsi Anda berada dalam zona waktu jam dari GMT. Seperti disebutkan di bawah, mencetakString
nilainya akan menampilkan string yang berbeda.sumber
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 menggunakanNow
atauUtcNow
.Secara internal tanggal disimpan sebagai
Ticks
(berbeda dengan jawaban @Carl Camera) berbeda tergantung pada apakah Anda menggunakanNow
atauUtcNow
.DateTime.UtcNow
berperilaku seperti bahasa lain. Ini ditetapkanTicks
ke nilai berdasarkan GMT. Ini juga diaturKind
keUtc
.DateTime.Now
mengubahTicks
nilai menjadi seperti apa jadinya waktu Anda di zona waktu GMT . Ini juga diaturKind
keLocal
.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 membuatDateTime
instance lalu mengubah zona waktu Anda dan mencoba menggunakannya.Contoh DateTime dengan nilai 'Jenis' yang berbeda TIDAK kompatibel.
Mari kita lihat beberapa kode ...
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 adaKind=Utc
, kecuali selama i / o (displaying dan parsing). Ini berarti Anda harus hampir selalu menggunakanDateTime.UtcNow
, kecuali untuk kasus di mana Anda membuat objek hanya untuk menampilkannya, dan segera membuangnya.sumber
DateTime tidak tahu apa zona waktu itu. Itu selalu mengasumsikan Anda berada di waktu setempat. UtcNow hanya berarti "Kurangi zona waktu saya dari waktu".
Jika Anda ingin menggunakan tanggal yang diketahui oleh zona waktu, gunakan DateTimeOffset , yang mewakili tanggal / waktu dengan zona waktu. Saya harus belajar itu dengan cara yang sulit.
sumber
Jawaban "sederhana" untuk pertanyaan ini adalah:
DateTime. Sekarang mengembalikan nilai DateTime yang mewakili saat ini, waktu sistem (dalam zona waktu apa pun sistem berjalan). The DateTime.Kind properti akan DateTimeKind.Local
DateTime.UtcNow mengembalikan nilai DateTime yang mewakili Waktu Koordinasi Universal saat ini (alias UTC) yang akan tetap sama terlepas dari zona waktu sistem. The DateTime.Kind properti akan DateTimeKind.Utc
sumber
Hanya sedikit tambahan untuk poin yang dibuat di atas: struct DateTime juga mengandung sedikit bidang yang dikenal disebut Kind (setidaknya, saya tidak tahu tentang itu untuk waktu yang lama). Ini pada dasarnya hanya sebuah bendera yang menunjukkan apakah waktu bersifat lokal atau UTC; itu tidak menentukan offset nyata dari UTC untuk waktu lokal. Selain fakta bahwa itu menunjukkan dengan niat apa stuct dibangun, itu juga mempengaruhi cara bagaimana metode ToUniversalTime () dan ToLocalTime () bekerja.
sumber
Sedikit terlambat ke pesta, tapi saya menemukan dua tautan ini (4guysfromrolla) sangat berguna:
Menggunakan Waktu Universal Terkoordinasi (UTC) untuk Menyimpan Nilai Tanggal / Waktu
Saran untuk Menyimpan dan Menampilkan Tanggal dan Waktu di Berbagai Zona Waktu
sumber
DateTime.UtcNow adalah skala waktu bernilai tunggal yang berkelanjutan, sedangkan DateTime.Now tidak berkelanjutan atau bernilai tunggal. Alasan utamanya adalah Daylight Savings Time, yang tidak berlaku untuk UTC. Jadi UTC tidak pernah melompat maju atau mundur satu jam, sedangkan waktu setempat (DateTime.Now) tidak. Dan ketika itu melompat mundur, nilai waktu yang sama terjadi dua kali.
sumber
DateTime.UtcNow adalah skala waktu Universal menghilangkan Daylight Savings Time. Jadi UTC tidak pernah berubah karena DST.
Tapi, DateTime. Sekarang tidak berkelanjutan atau bernilai tunggal karena itu berubah sesuai dengan DST. Yang berarti DateTime. Sekarang, nilai waktu yang sama dapat terjadi dua kali meninggalkan pelanggan dalam keadaan bingung.
sumber
Saat Anda membutuhkan waktu lokal untuk mesin yang menjalankan aplikasi Anda (seperti CEST untuk Eropa), gunakan Sekarang. Jika Anda ingin waktu universal - UtcNow. Ini hanya masalah preferensi Anda - mungkin membuat situs web lokal / aplikasi mandiri yang Anda ingin menggunakan waktu yang dimiliki pengguna - sangat terpengaruh oleh pengaturan zona waktunya - DateTime.Now.
Hanya ingat, untuk situs web itu adalah pengaturan zona waktu server. Jadi jika Anda menampilkan waktu untuk pengguna, dapatkan zona waktu pilihannya dan ubah waktu (cukup simpan waktu Utc ke basis data, dan modifikasi) atau tentukan UTC. Jika Anda lupa melakukannya, pengguna dapat melihat sesuatu seperti: mem-posting 3 minus lalu dan suatu saat di masa depan dekat itu :)
sumber
Perbedaan besar :) adalah DateTime.Now tidak didukung di SharePoint Workflow Anda harus menggunakan DateTime.UtcNow
sumber