Bagaimana cara mengubah DateTime? ke DateTime

171

Saya ingin mengonversi DateTime yang dapat dibatalkan ( DateTime?) menjadi DateTime, tetapi saya mendapatkan kesalahan:

Tidak dapat secara implisit mengonversi tipe 'System.DateTime?' ke 'System.DateTime'. Konversi eksplisit ada (apakah Anda melewatkan gips?)

Saya telah mencoba yang berikut ini:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate;
Waheed
sumber

Jawaban:

304

Anda ingin menggunakan operator penggabungan nol , yang dirancang tepat untuk tujuan ini.

Dengan menggunakannya Anda berakhir dengan kode ini.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
menggigil42
sumber
1
di sini adalah cuplikan yang saya gunakan dalam Presenter yang mengisi tampilan dengan Nullable Date / Time: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram
'Tanggal Waktu?' dosis tidak mengandung definisi untuk 'Tanggal Diperbarui'
Vasil Valchev
88

MS sudah membuat metode untuk ini, jadi Anda tidak perlu menggunakan operator penggabungan nol. Tidak ada perbedaan dalam fungsionalitas, tetapi lebih mudah bagi non-ahli untuk mendapatkan apa yang terjadi secara sekilas.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now);
Josh
sumber
43

Coba ini

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
Valentin Vasilyev
sumber
Kuncinya di sini adalah operator null-coalescing, lihat jawaban dinginkan 42 informasi lebih lanjut.
cspolton
24

Anda dapat menggunakan gips sederhana:

DateTime dtValue = (DateTime) dtNullAbleSource;

Seperti yang dikatakan Leandro Tupone, Anda harus memeriksa apakah var itu nol sebelumnya

César León
sumber
6
Sempurna jika Anda memeriksa apakah var nol sebelum +1
Leandro
22

Anda perlu memanggil properti Value dari DateTime yang dapat dibatalkan. Ini akan mengembalikan DateTime.

Dengan asumsi bahwa UpdatedDateadalah DateTime?, maka ini harus bekerja:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;

Untuk membuat kode sedikit lebih mudah dibaca, Anda bisa menggunakan properti HasValue daripada nullmemeriksa:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue
                          ? _objHotelPackageOrder.UpdatedDate.Value
                          : DateTime.Now;

Ini dapat dibuat lebih ringkas:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
adrianbank
sumber
6

Bagaimana dengan yang berikut:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue ? _objHotelPackageOrder.UpdatedDate.value : DateTime.Now;
Simon Wilson
sumber
6

Berikut adalah cuplikan yang saya gunakan dalam Presenter yang mengisi tampilan dengan Tanggal / Waktu Nullable

memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram
sumber
3

Anda juga dapat mencoba Properti Nullable (T) :

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate.HasValue 
    ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Mateusz Rogulski
sumber
1

Pertimbangkan untuk menggunakan yang berikut ini yang jauh lebih baik daripada jawaban yang diterima

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;
Sadiqabbas Hirani
sumber
Mau bilang kenapa lebih baik?
n4rzul
0

Coba ini:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Tim S. Van Haren
sumber
0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;
Vyas keras
sumber
4
Biasanya dianggap sebagai bentuk yang baik untuk menjelaskan saran / jawaban Anda. Jawaban kode saja bisa sangat tidak informatif, meskipun secara teknis benar.
Maximilian Ast
1
@ MaximilianAst ya Anda benar akan mencoba menerapkan cara yang Anda sarankan :)
Harsh Vyas