Kami sedang mengembangkan aplikasi C # untuk klien layanan web. Ini akan berjalan pada PC Windows XP.
Salah satu bidang yang dikembalikan oleh layanan web adalah bidang DateTime. Server mengembalikan bidang dalam format GMT yaitu dengan "Z" di akhir.
Namun, kami menemukan bahwa .NET tampaknya melakukan semacam konversi implisit dan waktu selalu keluar 12 jam.
Sampel kode berikut menyelesaikan ini sampai taraf tertentu di mana perbedaan 12 jam telah hilang tetapi tidak membuat penghematan untuk siang hari NZ.
CultureInfo ci = new CultureInfo("en-NZ");
string date = "Web service date".ToString("R", ci);
DateTime convertedDate = DateTime.Parse(date);
Sesuai situs tanggal ini :
Offset UTC / GMT
Zona waktu standar: UTC / GMT +12 jam
Waktu musim panas: +1 jam
Offset zona waktu saat ini: UTC / GMT +13 jam
Bagaimana kita menyesuaikan jam ekstra? Apakah ini dapat dilakukan secara terprogram atau apakah ini semacam pengaturan pada PC?
Z
waktu mengacu UTC, tidak GMT. Keduanya dapat berbeda hingga 0,9 detik.Jawaban:
Untuk string seperti
2012-09-19 01:27:30.000
,DateTime.Parse
tidak dapat menentukan dari zona waktu tanggal dan waktu.DateTime
memiliki properti Kind , yang dapat memiliki satu dari tiga opsi zona waktu:CATATAN Jika Anda ingin mewakili tanggal / waktu selain UTC atau zona waktu lokal Anda, maka Anda harus menggunakannya
DateTimeOffset
.Jadi untuk kode dalam pertanyaan Anda:
Anda mengatakan Anda tahu jenis apa itu, jadi katakan saja.
Sekarang, setelah sistem mengetahui waktu UTC, Anda cukup menelepon
ToLocalTime
:Ini akan memberi Anda hasil yang Anda butuhkan.
sumber
DateTime convertedTime = new DateTime(DateTime.Parse(dateStr).Ticks), DateTimeKind.Utc);
Kind
dariDateTime
dariUnspecified
menjadiUTC
tidak perlu.Unspecified
diasumsikanUTC
untuk keperluanToLocalTime
: msdn.microsoft.com/en-us/library/…Saya akan melihat ke dalam menggunakan kelas System.TimeZoneInfo jika Anda berada di .NET 3.5. Lihat http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx . Ini harus memperhitungkan perubahan tabungan siang hari dengan benar.
sumber
sumber
DateTime
objek memilikiKind
ofUnspecified
secara default, yang untuk tujuanToLocalTime
diasumsikanUTC
.Untuk mendapatkan waktu lokal suatu
Unspecified
DateTime
objek, Anda hanya perlu melakukan ini:Langkah mengubah
Kind
dariDateTime
dariUnspecified
menjadiUTC
tidak perlu.Unspecified
diasumsikanUTC
untuk keperluanToLocalTime
: http://msdn.microsoft.com/en-us/library/system.datetime.tolocaltime.aspxsumber
convertedDate.FromLocalTime();
akan dikonversi menjadiUTC
.Saya tahu ini adalah pertanyaan yang lebih lama, tetapi saya mengalami situasi yang sama, dan saya ingin berbagi apa yang saya temukan untuk pencari masa depan, mungkin termasuk saya sendiri :).
DateTime.Parse()
bisa rumit - lihat di sini misalnya.Jika
DateTime
berasal dari layanan Web atau sumber lain dengan format yang dikenal, Anda mungkin ingin mempertimbangkan sesuatu sepertiatau, bahkan lebih baik,
The
AssumeUniversal
bendera memberitahu parser bahwa tanggal / waktu sudah UTC; kombinasi dariAssumeUniversal
danAdjustToUniversal
memberitahu itu untuk tidak mengubah hasilnya ke waktu "lokal", yang akan coba lakukan secara default. (Saya pribadi mencoba untuk berurusan secara eksklusif dengan UTC di lapisan bisnis / aplikasi / layanan. Tetapi dengan memintas konversi ke waktu lokal juga mempercepat segalanya - hingga 50% atau lebih dalam pengujian saya, lihat di bawah.)Inilah yang kami lakukan sebelumnya:
Kami telah membuat profil aplikasi dan menemukan bahwa DateTime.Parse mewakili persentase penggunaan CPU yang signifikan. (Kebetulan,
CultureInfo
konstruktor itu bukan kontributor signifikan untuk penggunaan CPU.)Jadi saya mengatur aplikasi konsol untuk mengurai string tanggal / waktu 10000 kali dalam berbagai cara. Intinya:
Parse()
10 detikParseExact()
(mengkonversi ke lokal) 20-45 msParseExact()
(tidak mengkonversi ke lokal) 10-15 ms... dan ya, hasilnya
Parse()
dalam detik , sedangkan yang lain dalam milidetik .sumber
Saya hanya ingin menambahkan catatan umum tentang kehati-hatian.
Jika semua yang Anda lakukan adalah mendapatkan waktu saat ini dari jam internal komputer untuk meletakkan tanggal / waktu pada tampilan atau laporan, maka semuanya baik-baik saja. Tetapi jika Anda menyimpan informasi tanggal / waktu untuk referensi di kemudian hari atau menghitung tanggal / waktu, waspadalah!
Katakanlah Anda menentukan bahwa sebuah kapal pesiar tiba di Honolulu pada 20 Desember 2007 pukul 15:00 UTC. Dan Anda ingin tahu jam berapa waktu itu. Penghematan waktu siang hari diterapkan secara berbeda (atau tidak sama sekali) di berbagai subdivisi politik. Jangan berpikir bahwa hanya karena negara Anda berubah pada tanggal tertentu, maka negara lain juga akan melakukannya.
1. Mungkin ada setidaknya tiga 'penduduk setempat' yang terlibat. Lokal mungkin berarti Honolulu, atau itu bisa berarti di mana komputer Anda berada, atau itu mungkin berarti lokasi di mana pelanggan Anda berada.
2. Jika Anda menggunakan fungsi bawaan untuk melakukan konversi, itu mungkin salah. Ini karena waktu penghematan siang hari (mungkin) saat ini berlaku di komputer Anda, tetapi TIDAK berlaku pada bulan Desember. Tetapi Windows tidak tahu ini ... yang dimilikinya hanyalah satu bendera untuk menentukan apakah waktu musim panas berlaku. Dan jika saat ini berlaku, maka dengan senang hati akan menambahkan satu jam bahkan ke tanggal di bulan Desember.
3.
sumber
sumber
Jangan lupa jika Anda sudah memiliki objek DateTime dan tidak yakin apakah itu UTC atau Lokal, cukup mudah untuk menggunakan metode pada objek secara langsung:
Kecuali .net yang ditentukan akan menggunakan pengaturan pc lokal. Saya akan membaca: http://msdn.microsoft.com/en-us/library/system.globalization.daylighttime.aspx
Dari tampilannya, kodenya mungkin terlihat seperti:
Dan seperti yang disebutkan di atas, periksa kembali pengaturan zona waktu server Anda aktif. Ada artikel di internet tentang cara aman mempengaruhi perubahan di IIS.
sumber
Sebagai jawaban atas saran Dana:
Contoh kode sekarang terlihat seperti:
Tanggal aslinya adalah 20/08/08; jenisnya adalah UTC.
Baik "convertDate" dan "dt" sama:
21/08/08 10:00:26; jenisnya lokal
sumber
Saya punya masalah dengan itu dalam kumpulan data didorong melintasi kawat (layanan web ke klien) yang secara otomatis akan berubah karena bidang DateType DataColumn diatur ke lokal. Pastikan Anda memeriksa apa DateType jika Anda mendorong DataSets.
Jika Anda tidak ingin itu berubah, tetapkan ke Tidak ditentukan
sumber
Saya menemukan pertanyaan ini karena saya mengalami masalah dengan tanggal UTC yang Anda dapatkan kembali melalui API twitter (bidang yang dibuat pada status); Saya perlu mengubahnya menjadi DateTime. Tidak ada satu pun jawaban / contoh kode dalam jawaban pada halaman ini yang cukup untuk menghentikan saya mendapatkan kesalahan "String tidak dikenali sebagai DateTime" yang valid (tapi itu adalah yang paling dekat saya harus menemukan jawaban yang benar pada SO)
Posting tautan ini di sini kalau-kalau ini membantu orang lain - jawaban yang saya butuhkan ditemukan di posting blog ini: http://www.wduffy.co.uk/blog/parsing-dates-when-aspnets-datetimeparse-doesnt-work/ - pada dasarnya menggunakan DateTime.ParseExact dengan string format, bukan DateTime.Parse
sumber