DateTime "null" nilai

I've telah mencari banyak tapi tidak't menemukan solusi. Bagaimana anda berurusan dengan DateTime yang harus mampu mengandung uninitialized nilai (setara dengan null)? Saya memiliki kelas yang mungkin memiliki DateTime nilai properti yang ditetapkan atau tidak. Aku berpikir untuk menginisialisasi properti holder ke DateTime.MinValue, yang kemudian bisa dengan mudah diperiksa. Saya kira ini adalah cukup umum pertanyaan, bagaimana anda melakukan itu?

Larutan

Untuk normal DateTimes, jika anda don't menginisialisasi mereka di semua maka mereka akan cocok DateTime.MinValue, karena itu adalah tipe nilai daripada tipe referensi.

Anda juga dapat menggunakan nullable DateTime, seperti ini:

DateTime? MyNullableDate;

Atau lagi bentuk:

Nullable MyNullableDate;

Dan, akhirnya, ada's built in cara untuk referensi default dari jenis apa pun. Ini kembali null untuk referensi jenis, tetapi untuk kami DateTime contoh itu akan kembali sama seperti DateTime.MinValue:

default(DateTime)
Komentar (5)

Jika anda're menggunakan .NET 2.0 (atau yang lebih baru), anda dapat menggunakan nullable type:

DateTime? dt = null;

atau

Nullable dt = null;

kemudian:

dt = new DateTime();

Dan anda dapat memeriksa nilai dengan:

if (dt.HasValue)
{
  // Do something with dt.Value
}

Atau anda dapat menggunakannya seperti:

DateTime dt2 = dt ?? DateTime.MinValue;

Anda dapat membaca lebih lanjut di sini: http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

Komentar (6)

DateTime? MyDateTime{get;set;}

MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);
Komentar (1)

Berikut cara bekerja dengan baik

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;

Harap dicatat bahwa properti PublishDate harus DateTime?

Komentar (0)

I'd pertimbangkan untuk menggunakan nullable types.

DateTime? myDate bukan DateTime myDate.

Komentar (0)

Anda dapat menggunakan nullable kelas.

DateTime? date = new DateTime?();
Komentar (1)

Anda dapat menggunakan nullable DateTime untuk ini.

Nullable myDateTime;

atau hal yang sama dituliskan seperti ini:

DateTime? myDateTime;
Komentar (0)

Hal ini perlu menunjukkan bahwa, sementara DateTime variabel tidak dapat null, itu masih dapat dibandingkan dengan null tanpa compiler error:


DateTime date;
...
if(date == null) // 
Komentar (0)

Saya selalu mengatur waktu untuk DateTime.MinValue. Cara ini aku tidak mendapatkan apapun NullErrorException dan saya dapat membandingkannya dengan tanggal yang aku tahu isn't set.

Komentar (9)

Anda dapat mengatur DateTime untuk Nullable. Secara default DateTime tidak nullable. Anda dapat membuatnya nullable dalam beberapa cara. Menggunakan tanda tanya setelah tipe DateTime? myTime atau menggunakan generic gaya Nullable.

DateTime? nullDate = null;

atau

DateTime? nullDate;
Komentar (0)

Hanya berhati-hatilah Ketika menggunakan Nullable yang jelas tidak ada lagi 'murni' datetime objek, seperti anda tidak dapat mengakses DateTime anggota secara langsung. I'll mencoba menjelaskan.

Dengan menggunakan Nullable<> anda're pada dasarnya pembungkus DateTime dalam wadah (terima kasih generik) yang nullable - jelas tujuannya. Ini wadah yang memiliki sifat sendiri yang anda dapat menghubungi yang akan memberikan akses tersebut DateTime objek; setelah menggunakan properti yang benar - dalam hal ini Nullable.Nilai - maka anda memiliki akses ke standar DateTime anggota, sifat dll.

Jadi sekarang masalah ini datang ke pikiran sebagai cara terbaik untuk mengakses DateTime objek. Ada beberapa cara, nomor 1 adalah JAUH terbaik dan 2 adalah "bung mengapa".

  1. Menggunakan Nullable.Nilai properti,

DateTime date = myNullableObject.Nilai.ToUniversalTime(); //Bekerja

DateTime date = myNullableObject.ToUniversalTime(); //Tidak datetime objek, gagal

  1. Mengkonversi nullable objek untuk menggunakan datetime Mengkonversi.ToDateTime(),

DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //tapi mengapa...

Meskipun jawabannya adalah didokumentasikan dengan baik pada titik ini, saya percaya penggunaan Nullable adalah mungkin layak posting tentang. Maaf jika anda tidak setuju.

edit: Dihapus pilihan ketiga seperti itu agak terlalu spesifik dan tergantung kasus.

Komentar (0)

Meskipun semua orang telah memberikan anda jawabannya , saya'll menyebutkan cara yang membuatnya mudah untuk lulus datetime ke fungsi

[ERROR:tidak dapat mengubah sistem.datetime? untuk sistem.datetime]

DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);

Sekarang anda dapat melewati dte dalam fungsi tanpa masalah apapun.

Komentar (0)

Jika anda, kadang-kadang, mengharapkan null anda bisa menggunakan sesuatu seperti ini:

var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)

Dalam repositori anda menggunakan null-mampu datetime.

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}
Komentar (0)

Aku punya masalah yang sama seperti yang saya punya untuk memberikan Null sebagai parameter untuk DateTime saat melakukan Unit test untuk Melempar ArgumentNullException.Bekerja dalam kasus saya menggunakan opsi berikut:

Assert.Throws(()=>sut.StartingDate = DateTime.Parse(null));
Komentar (0)

Mengingat sifat dari suatu data tanggal/waktu jenis ini tidak mengandung nilai "null", yaitu kebutuhan untuk memiliki sebuah nilai, tidak dapat kosong atau berisi apa-apa. Jika anda menandai tanggal/waktu variabel sebagai nullable maka hanya anda dapat menetapkan nilai null untuk itu. Jadi apa yang anda ingin lakukan adalah salah satu dari dua hal (mungkin masih ada lagi tapi aku hanya bisa memikirkan dua):

  • Menetapkan minimum nilai tanggal/waktu untuk variabel anda jika anda don't memiliki nilai untuk itu. Anda dapat menetapkan maksimum nilai tanggal/waktu serta cara mana yang sesuai dengan anda. Hanya pastikan bahwa anda konsisten situs-lebar ketika memeriksa nilai-nilai tanggal. Memutuskan untuk menggunakan min atau max dan tetap dengan itu.

  • Menandai tanggal/waktu variabel sebagai nullable. Dengan cara ini anda dapat mengatur tanggal/waktu variabel untuk null jika anda don't memiliki variabel untuk itu.

Biarkan saya menunjukkan titik pertama saya menggunakan contoh. The DateTime jenis variabel tidak dapat diatur untuk null, perlu nilai, dalam hal ini saya akan atur ke DateTime's nilai minimum jika tidak ada nilai.

Skenario saya adalah bahwa saya memiliki BlogPost kelas. Ini memiliki berbagai bidang/properti tapi saya hanya memilih untuk menggunakan dua untuk contoh ini. DatePublished adalah ketika posting ini diterbitkan ke situs web dan harus berisi nilai tanggal/waktu. DateModified adalah ketika posting dimodifikasi, sehingga tidak't harus mengandung nilai, tetapi dapat berisi suatu nilai.

public class BlogPost : Entity
{
     public DateTime DateModified { get; set; }

     public DateTime DatePublished { get; set; }
}

Menggunakan ADO.NET untuk mendapatkan data dari database (menetapkan DateTime.MinValue adalah tidak ada nilai):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue(1);

Anda dapat mencapai titik kedua saya dengan menandai DateModified lapangan nullable. Sekarang anda dapat mengaturnya untuk kosong jika tidak ada nilai untuk itu:

public DateTime? DateModified { get; set; }

Menggunakan ADO.NET untuk mendapatkan data dari database, maka akan terlihat sedikit berbeda dengan cara yang dilakukan di atas (menetapkan null bukan DateTime.MinValue):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue(1);

Saya berharap hal ini membantu untuk menjernihkan kebingungan. Mengingat bahwa tanggapan saya adalah sekitar 8 tahun kemudian anda mungkin seorang ahli C# programmer sekarang :)

Komentar (0)