Saya memiliki tanggal dan waktu dalam string yang diformat seperti itu:
"2011-03-21 13:26" //year-month-day hour:minute
Bagaimana saya bisa menguraikannya System.DateTime
?
Saya ingin menggunakan fungsi seperti DateTime.Parse()
atau DateTime.ParseExact()
jika mungkin, untuk dapat menentukan format tanggal secara manual.
Jawaban:
DateTime.Parse()
akan mencoba mencari tahu format tanggal yang diberikan, dan biasanya melakukan pekerjaan dengan baik. Jika Anda dapat menjamin tanggal akan selalu dalam format yang diberikan maka Anda dapat menggunakanParseExact()
:(Tetapi perhatikan bahwa biasanya lebih aman menggunakan salah satu metode TryParse jika tanggal tidak dalam format yang diharapkan)
Pastikan untuk memeriksa String Format Tanggal dan Waktu Kustom ketika membangun string format, terutama memperhatikan jumlah huruf dan huruf (yaitu "MM" dan "mm" berarti hal yang sangat berbeda).
Sumber daya lain yang berguna untuk string format C # adalah Pemformatan String dalam C #
sumber
s
. Oleh karena itu, lebih baik menggunakan TryParseExcact. Saya telah menunjukkan mengapa dalam jawaban saya di bawah ini.Seperti yang akan saya jelaskan nanti, saya akan selalu mendukung
TryParse
danTryParseExact
metode. Karena mereka agak besar untuk digunakan, saya telah menulis metode ekstensi yang membuat parsing lebih mudah:Tidak seperti
Parse
,ParseExact
dll. Itu tidak membuang pengecualian, dan memungkinkan Anda untuk memeriksa viaif (dt.HasValue) { // continue processing } else { // do error handling }
apakah konversi berhasil (dalam hal ini
dt
memiliki nilai yang dapat Anda akses melaluidt.Value
) atau tidak (dalam hal ini, itu adalahnull
).Itu bahkan memungkinkan untuk menggunakan pintasan elegan seperti operator "Elvis"
?.
, misalnya:Di sini Anda juga dapat menggunakan
year.HasValue
untuk memeriksa apakah konversi berhasil, dan jika tidak berhasil makayear
akan berisinull
, jika tidak, bagian tahun tanggal. Tidak ada pengecualian yang dilemparkan jika konversi gagal.Solusi: Metode ekstensi .ToDate ()
Cobalah di .NetFiddle
Beberapa informasi tentang kode
Anda mungkin bertanya-tanya, mengapa saya menggunakan
InvariantCulture
panggilanTryParseExact
: Ini untuk memaksa fungsi untuk memperlakukan pola format selalu dengan cara yang sama (jika tidak misalnya "." Dapat diartikan sebagai pemisah desimal dalam bahasa Inggris sementara itu adalah pemisah grup atau pemisah tanggal di Jerman). Ingat kita sudah menanyakan string format berbasis budaya beberapa baris sebelumnya sehingga tidak apa-apa di sini.Pembaruan:
.ToDate()
(tanpa parameter) sekarang default untuk semua pola tanggal / waktu umum budaya saat ini utas.Perhatikan bahwa kita perlu
result
dandt
bersama - sama, karenaTryParseExact
tidak memungkinkan untuk digunakanDateTime?
, yang ingin kita kembalikan. Di C # Versi 7 Anda bisa menyederhanakanToDate
fungsi sedikit sebagai berikut:atau, jika Anda suka lebih pendek:
dalam hal ini Anda tidak perlu dua deklarasi
DateTime? result = null;
danDateTime dt;
sama sekali - Anda dapat melakukannya dalam satu baris kode. (Ini juga akan diizinkan untuk menulisout DateTime dt
alih-alihout var dt
jika Anda lebih suka itu).Saya telah menyederhanakan kode lebih lanjut dengan menggunakan
params
kata kunci: Sekarang Anda tidak perlu 2 nd kelebihan beban metode lagi.Contoh penggunaan
Seperti yang Anda lihat, contoh ini hanya menanyakan
dt.HasValue
apakah konversi berhasil atau tidak. Sebagai bonus tambahan, TryParseExact memungkinkan untuk menentukan dengan ketatDateTimeStyles
sehingga Anda tahu persis apakah string tanggal / waktu yang tepat telah berlalu atau tidak.Lebih Banyak Contoh penggunaan
Fungsi kelebihan beban memungkinkan Anda untuk melewatkan larik format yang valid yang digunakan untuk mem-parsing / mengubah tanggal seperti yang ditunjukkan di sini juga (
TryParseExact
secara langsung mendukung ini), misalnyaJika Anda hanya memiliki beberapa pola templat, Anda juga dapat menulis:
Contoh lanjutan
Anda dapat menggunakan
??
operator secara default ke format gagal-aman, misDalam hal ini,
.ToDate()
akan menggunakan format tanggal kultur lokal yang umum, dan jika semua ini gagal, ia akan mencoba menggunakan format standar ISO"yyyy-MM-dd HH:mm:ss"
sebagai cadangan. Dengan cara ini, fungsi ekstensi memungkinkan untuk "rantai" berbagai format fallback dengan mudah.Anda bahkan dapat menggunakan ekstensi di LINQ, coba ini (ada di .NetFiddle di atas):
yang akan mengonversi tanggal dalam array dengan cepat menggunakan pola dan membuangnya ke konsol.
Beberapa latar belakang tentang TryParseExact
Akhirnya, Berikut adalah beberapa komentar tentang latar belakang (yaitu alasan mengapa saya menulis seperti ini):
Saya lebih suka TryParseExact dalam metode ekstensi ini, karena Anda menghindari penanganan pengecualian - Anda dapat membaca di artikel Eric Lippert tentang pengecualian mengapa Anda harus menggunakan TryParse daripada Parse, saya kutipkan kepadanya tentang topik itu: 2)
Ya, tetapi
TryParse
danTryParseExact
keduanya masih jauh dari nyaman untuk digunakan: Mereka memaksa Anda untuk menggunakan variabel yang tidak diinisialisasi sebagaiout
parameter yang tidak boleh nullable dan saat Anda mengonversi, Anda perlu mengevaluasi nilai pengembalian boolean - baik Anda memiliki untuk menggunakanif
pernyataan segera atau Anda harus menyimpan nilai kembali dalam variabel boolean tambahan sehingga Anda dapat melakukan pemeriksaan nanti. Dan Anda tidak bisa hanya menggunakan variabel target tanpa mengetahui apakah konversi berhasil atau tidak.Dalam kebanyakan kasus, Anda hanya ingin tahu apakah konversi berhasil atau tidak (dan tentu saja nilainya jika berhasil) , sehingga variabel target yang dapat dibatalkan yang membuat semua informasi diinginkan dan jauh lebih elegan - karena seluruh informasi hanya disimpan di satu tempat: Itu konsisten dan mudah digunakan, dan jauh lebih rentan kesalahan.
Metode ekstensi yang saya tulis tidak persis seperti itu (itu juga menunjukkan kepada Anda jenis kode apa yang harus Anda tulis setiap kali jika Anda tidak akan menggunakannya).
Saya percaya manfaatnya
.ToDate(strDateFormat)
adalah tampilannya sederhana dan bersih - semudahDateTime.Parse
yang seharusnya - tetapi dengan kemampuan untuk memeriksa apakah konversi berhasil, dan tanpa membuang pengecualian.1) Yang dimaksud di sini adalah penanganan pengecualian (yaitu
try { ... } catch(Exception ex) { ...}
blok) - yang diperlukan saat Anda menggunakan Parse karena akan mengeluarkan pengecualian jika string yang tidak valid diurai - tidak hanya tidak perlu dalam kasus ini tetapi juga mengganggu, dan menyulitkan kode Anda. TryParse menghindari semua ini karena contoh kode yang saya berikan ditampilkan.2) Eric Lippert adalah rekan StackOverflow yang terkenal dan bekerja di Microsoft sebagai pengembang utama di tim kompiler C # selama beberapa tahun.
sumber
Lihat tautan ini untuk string format lain!
sumber
DateTime.Parse () akan berfungsi dengan baik untuk format string itu. Referensi:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240
Apakah itu melempar FormatException untuk Anda?
sumber
Masukkan nilai string yang dapat dibaca manusia ke dalam .NET DateTime dengan kode seperti ini:
sumber
Jawaban sederhana dan langsung ->
sumber
Anda juga dapat menggunakan XmlConvert.ToDateString
Baik untuk menentukan jenis tanggal, kodenya adalah:
Lebih detail tentang opsi penguraian yang berbeda http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html
sumber
Coba kode berikut
sumber