Saya telah menemukan cara mengubah DateTime menjadi format ISO 8601 , tetapi tidak ada cara melakukan kebalikannya di C #.
Saya punya 2010-08-20T15:00:00Z
, dan saya ingin mengubahnya menjadi DateTime
objek.
Saya bisa memisahkan bagian-bagian dari senar itu sendiri, tetapi sepertinya banyak pekerjaan untuk sesuatu yang sudah menjadi standar internasional.
Jawaban:
Solusi ini menggunakan enumerasi DateTimeStyles , dan juga bekerja dengan Z.
Ini mencetak solusinya dengan sempurna.
sumber
DateTime d2= DateTime.Parse("2010-08-20T15:00:00Z", null, DateTimeStyles.RoundtripKind);
tampaknya bekerja dengan baik.DateTimeStyles.RoundtripKind?
deskripsi MSDN ini kosong.2018-06-19T14:56:14.123Z
diuraikan sebagai waktu lokal, bukan UTC. Saya menggunakanCultureInfo.InvariantCulture
bukan null.DateTimeStyles.RoundTripKind
, lihat stackoverflow.com/q/39572395/2014893Meskipun MSDN mengatakan bahwa format "s" dan "o" mencerminkan standar, mereka tampaknya hanya dapat menguraikan sebagian saja. Terutama masalah jika string berisi spesifikasi zona waktu. (Baik itu berlaku untuk format ISO8601 dasar, atau format presisi yang diperkecil - namun ini bukan kasus Anda.) Itulah mengapa saya menggunakan string format khusus ketika harus mem-parsing ISO8601. Saat ini cuplikan pilihan saya adalah:
Jika Anda tidak keberatan mem-parsing string TZ-less (saya lakukan), Anda dapat menambahkan baris "s" untuk menambah jumlah perubahan format yang dibahas.
sumber
"yyyyMMdd"
dalamformats
array untuk akurasi dikurangi menjadi hari, karena ini adalah kadang-kadang terjadi ketika sebuah RFC 5545 RRULE akan bergantung pada DTSTART untuk memberikan waktu.K
memungkinkan Anda untuk menggabungkan penanganan zona waktu yang berbeda. Saya memiliki varian yang lebih luas di stackoverflow.com/a/31246449/400547 tetapi itu jika ada sesuatu yang terlalu luas (menerima hal-hal yang valid ISO 8601 tetapi tidak digunakan dalam profil yang lebih umum) tetapi itu menunjukkan bagaimana caraK
mengurangi ukuran dengan ketiga.sumber
Ini adalah salah satu yang bekerja lebih baik untuk saya ( versi LINQPad ):
menghasilkan
sumber
Tampaknya penting untuk mencocokkan dengan tepat format string ISO
TryParseExact
agar berfungsi. Saya kira Exact adalah Exact dan jawaban ini jelas bagi sebagian besar tetapi tetap ...Dalam kasus saya, jawaban Reb.Cabin tidak berfungsi karena saya memiliki input yang sedikit berbeda sesuai "nilai" saya di bawah.
Nilai:
2012-08-10T14:00:00.000Z
Ada beberapa 000 tambahan di sana selama milidetik dan mungkin ada lebih banyak.
Namun jika saya menambahkan beberapa
.fff
ke format seperti yang ditunjukkan di bawah ini, semuanya baik-baik saja.Format String:
@"yyyy-MM-dd\THH:mm:ss.fff\Z"
Di Jendela Segera VS2010:
benar
Anda mungkin harus menggunakan
DateTimeStyles.AssumeLocal
juga tergantung pada zona waktu Anda untuk ...sumber
AssumeUniversal
keAdjustToUniversal
.Ini berfungsi dengan baik di LINQPad4:
sumber
DateTime.ParseExact(...)
memungkinkan Anda memberi tahu parser apa yang diwakili masing-masing karakter.sumber