Saya sudah banyak mencari tetapi tidak dapat menemukan solusi. Bagaimana Anda menangani DateTime yang seharusnya dapat mengandung nilai yang tidak diinisialisasi (setara dengan nol)? Saya memiliki kelas yang mungkin memiliki nilai properti DateTime yang ditetapkan atau tidak. Saya berpikir untuk menginisialisasi pemegang properti menjadi DateTime.MinValue, yang kemudian dapat dengan mudah diperiksa. Saya kira ini adalah pertanyaan yang cukup umum, bagaimana Anda melakukannya?
273
DateTime.MinValue
jugaMyNullableDate=date;
mengaturnya,MyDate = MyNullableDate.Value;
untuk membacanya, danif(MyNullableDate.HasValue)
untuk memeriksa apakah itu nolJika Anda menggunakan .NET 2.0 (atau lebih baru), Anda dapat menggunakan jenis nullable:
atau
lalu nanti:
Dan Anda dapat memeriksa nilainya dengan:
Atau Anda dapat menggunakannya seperti:
Anda dapat membaca lebih lanjut di sini:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
sumber
dt.GetValueOrDefault()
- ini adalah opsi yang paling efisien.Tanggal Waktu? MyDateTime {get; set;}
sumber
null
tidak berhasil. Itu perlu(DateTime?)null
.Cara mengikuti juga berfungsi
Harap perhatikan bahwa properti PublishDate harus DateTime?
sumber
Saya akan mempertimbangkan menggunakan tipe yang dapat dibatalkan .
DateTime? myDate
bukannyaDateTime myDate
.sumber
Perlu ditunjukkan bahwa, sementara
DateTime
variabel tidak bisanull
, itu masih dapat dibandingkan dengannull
tanpa kesalahan kompiler:sumber
Anda bisa menggunakan kelas nullable.
sumber
DateTime
. Seperti yang disebutkan sebelumnya,new DateTime()
akan secara efektif memberi AndaDateTime.Min
sedangkannew DateTime?()
akan menghasilkan nol.Anda dapat menggunakan DateTime yang dapat dibatalkan untuk ini.
atau hal yang sama tertulis seperti ini:
sumber
Anda dapat mengatur DateTime ke Nullable. Secara default DateTime tidak dapat dibatalkan. Anda dapat membuatnya nullable dalam beberapa cara. Menggunakan tanda tanya setelah jenis DateTime? myTime atau menggunakan gaya generik Nullable.
atau
sumber
Saya selalu mengatur waktu untuk
DateTime.MinValue
. Dengan cara ini saya tidak mendapatkan NullErrorException dan saya bisa membandingkannya dengan tanggal yang saya tahu tidak disetel.sumber
Hanya diperingatkan - Saat menggunakan Nullable itu jelas tidak lagi objek datetime 'murni', karena itu Anda tidak dapat mengakses anggota DateTime secara langsung. Saya akan coba jelaskan.
Dengan menggunakan Nullable <> Anda pada dasarnya membungkus DateTime dalam sebuah wadah (terima kasih obat generik) yang dapat dibatalkan - jelas tujuannya. Wadah ini memiliki properti sendiri yang dapat Anda panggil yang akan memberikan akses ke objek DateTime yang disebutkan di atas; setelah menggunakan properti yang benar - dalam hal ini Nullable.Value - Anda kemudian memiliki akses ke anggota DateTime standar, properti, dll.
Jadi - sekarang masalah muncul di pikiran tentang cara terbaik untuk mengakses objek DateTime. Ada beberapa cara, nomor 1 adalah JAUH yang terbaik dan 2 adalah "Bung mengapa".
Menggunakan properti Nullable.Value,
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Mengonversi objek yang dapat dibatalkan ke datetime menggunakan Convert.ToDateTime (),
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
Meskipun jawabannya didokumentasikan dengan baik pada saat ini, saya percaya penggunaan Nullable mungkin layak untuk dikirim. Maaf jika Anda tidak setuju.
sunting: Menghapus opsi ketiga karena agak terlalu spesifik dan tergantung kasus.
sumber
Meskipun semua orang telah memberi Anda jawabannya, saya akan menyebutkan cara yang membuatnya mudah untuk melewatkan waktu ke fungsi
[KESALAHAN: tidak bisa mengonversi system.datetime? ke system.datetime]
Sekarang Anda dapat melewati dte di dalam fungsi tanpa masalah.
sumber
Jika Anda, kadang-kadang, mengharapkan null Anda dapat menggunakan sesuatu seperti ini:
Dalam repositori Anda, gunakan datetime yang tidak dapat digunakan.
sumber
Saya memiliki masalah yang sama seperti saya harus memberikan Null sebagai parameter untuk DateTime saat melakukan tes Unit untuk Melempar ArgumentNullException. Ini bekerja dalam kasus saya menggunakan opsi berikut:
sumber
Mengingat sifat tipe data tanggal / waktu itu tidak dapat berisi
null
nilai, yaitu perlu mengandung nilai, itu tidak boleh kosong atau tidak mengandung apa pun. Jika Anda menandai variabel tanggal / waktunullable
maka Anda hanya dapat menetapkan nilai nol untuknya. Jadi yang ingin Anda lakukan adalah salah satu dari dua hal (mungkin ada lebih banyak tetapi saya hanya bisa memikirkan dua):Tetapkan nilai tanggal / waktu minimum untuk variabel Anda jika Anda tidak memiliki nilai untuk itu. Anda dapat menetapkan nilai tanggal / waktu maksimum juga - mana yang cocok untuk Anda. Pastikan bahwa Anda konsisten di seluruh situs saat memeriksa nilai tanggal / waktu Anda. Putuskan untuk menggunakan
min
ataumax
dan tetap menggunakannya.Tandai variabel tanggal / waktu Anda sebagai
nullable
. Dengan cara ini Anda dapat mengatur variabel tanggal / waktunull
Anda jika Anda tidak memiliki variabel untuk itu.Biarkan saya menunjukkan poin pertama saya menggunakan contoh. The
DateTime
jenis variabel tidak dapat diatur untuk null, perlu nilai, dalam hal ini saya akan set keDateTime
's nilai minimum jika tidak ada nilai.Skenario saya adalah saya memiliki
BlogPost
kelas. Ini memiliki banyak bidang / properti yang berbeda tetapi saya memilih hanya menggunakan dua untuk contoh ini.DatePublished
adalah ketika posting dipublikasikan ke situs web dan harus mengandung nilai tanggal / waktu.DateModified
adalah ketika sebuah posting diubah, sehingga tidak harus mengandung nilai, tetapi dapat mengandung nilai.Menggunakan
ADO.NET
untuk mendapatkan data dari database (menetapkanDateTime.MinValue
apakah tidak ada nilai):Anda dapat mencapai poin kedua saya dengan menandai
DateModified
bidang sebagainullable
. Sekarang Anda dapat mengaturnyanull
jika tidak ada nilai untuk itu:Menggunakan
ADO.NET
untuk mendapatkan data dari database, itu akan terlihat sedikit berbeda dengan cara itu dilakukan di atas (null
bukan penugasanDateTime.MinValue
):Saya harap ini membantu menjernihkan kebingungan. Mengingat bahwa tanggapan saya sekitar 8 tahun kemudian, Anda mungkin seorang programmer C # yang ahli sekarang :)
sumber