Bagaimana saya bisa mengubah DateTime dt2 yang dapat dibatalkan menjadi string yang diformat?
DateTime dt = DateTime.Now;
Console.WriteLine(dt.ToString("yyyy-MM-dd hh:mm:ss")); //works
DateTime? dt2 = DateTime.Now;
Console.WriteLine(dt2.ToString("yyyy-MM-dd hh:mm:ss")); //gives following error:
tidak ada kelebihan untuk metode ToString membutuhkan satu argumen
c#
datetime
formatting
nullable
Edward Tanguay
sumber
sumber
Jawaban:
EDIT: Seperti yang dinyatakan dalam komentar lain, periksa apakah ada nilai yang bukan nol.
Pembaruan: seperti yang direkomendasikan dalam komentar, metode ekstensi:
Dan mulai dari C # 6, Anda dapat menggunakan operator kondisional nol untuk menyederhanakan kode lebih. Ekspresi di bawah ini akan mengembalikan nol jika
DateTime?
nol.sumber
Coba ini untuk ukuran:
Objek dateTime aktual yang ingin Anda format adalah di properti dt.Value, dan bukan pada objek dt2 itu sendiri.
sumber
Kalian semua lebih dari rekayasa ini dan membuatnya jauh lebih rumit daripada yang sebenarnya. Yang penting, berhenti menggunakan ToString dan mulai menggunakan pemformatan string seperti string. Kesesuaian atau metode yang mendukung pemformatan string seperti Console.WriteLine. Inilah solusi yang disukai untuk pertanyaan ini. Ini juga yang paling aman.
Memperbarui:
Saya memperbarui contoh dengan metode terkini dari kompiler C # hari ini. operator bersyarat & interpolasi string
Output: (Saya menempatkan tanda kutip tunggal di dalamnya sehingga Anda dapat melihat bahwa ia kembali sebagai string kosong ketika nol)
sumber
Seperti yang dinyatakan orang lain, Anda perlu memeriksa nol sebelum memohon ToString tetapi untuk menghindari pengulangan, Anda dapat membuat metode ekstensi yang melakukan itu, seperti:
Yang bisa dipanggil seperti:
sumber
C # 6.0 bayi:
dt2?.ToString("dd/MM/yyyy");
sumber
Console.WriteLine(dt2?.ToString("yyyy-MM-dd hh:mm:ss" ?? "n/a");
Masalah dengan merumuskan jawaban untuk pertanyaan ini adalah bahwa Anda tidak menentukan output yang diinginkan ketika datable nullable tidak memiliki nilai. Kode berikut akan menampilkan
DateTime.MinValue
dalam kasus seperti itu, dan tidak seperti jawaban yang saat ini diterima, tidak akan memberikan pengecualian.sumber
Melihat bahwa Anda benar-benar ingin memberikan format saya sarankan untuk menambahkan antarmuka IFormattable ke metode ekstensi Smalls seperti itu, sehingga Anda tidak memiliki penggabungan format string yang buruk.
sumber
Bagaimana dengan sesuatu yang semudah ini:
sumber
Anda dapat menggunakan
dt2.Value.ToString("format")
, tetapi tentu saja itu mengharuskan dt2! = Null, dan itu meniadakan penggunaan tipe nullable di tempat pertama.Ada beberapa solusi di sini, tetapi pertanyaan besarnya adalah: Bagaimana Anda ingin memformat
null
tanggal?sumber
Ini pendekatan yang lebih umum. Ini akan memungkinkan Anda untuk memformat tipe nilai nullable apa pun. Saya telah memasukkan metode kedua untuk memungkinkan mengganti nilai string default alih-alih menggunakan nilai default untuk tipe nilai.
sumber
Jawaban tersingkat
Tes
sumber
Bahkan solusi yang lebih baik di C # 6.0:
sumber
Sintaks RAZOR:
sumber
Saya pikir Anda harus menggunakan GetValueOrDefault-Methode. Perilaku dengan ToString ("yy ...") tidak ditentukan jika turunannya null.
sumber
Ini jawaban Blake yang luar biasa sebagai metode ekstensi. Tambahkan ini ke proyek Anda dan panggilan dalam pertanyaan akan berfungsi seperti yang diharapkan.
Artinya digunakan seperti
MyNullableDateTime.ToString("dd/MM/yyyy")
, dengan output yang sama denganMyDateTime.ToString("dd/MM/yyyy")
, kecuali bahwa nilainya akan menjadi"N/A"
jika DateTime adalah nol.sumber
IFormattable juga menyertakan penyedia format yang dapat digunakan, memungkinkan kedua format IFormatProvider menjadi nol di dotnet 4.0.
menggunakan bersama dengan parameter bernama yang dapat Anda lakukan:
dt2.ToString (defaultValue: "n / a");
Dalam versi dotnet yang lama, Anda mendapatkan banyak kelebihan
sumber
Saya suka opsi ini:
sumber
Ekstensi generik sederhana
sumber
Mungkin itu adalah jawaban yang terlambat tetapi dapat membantu orang lain.
Sederhana adalah:
atau cukup gunakan format apa saja daripada "d".
Terbaik
sumber
Anda dapat menggunakan garis sederhana:
sumber