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;

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;

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);

43

Coba ini

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;

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


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;

6

Bagaimana dengan yang berikut:

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

6

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

memDateLogin = m.memDateLogin ?? DateTime.MinValue


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;

Mau bilang kenapa lebih baik?
n4rzul

0

Coba ini:

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.