¿Cómo convertir DateTime? a DateTime

171

Quiero convertir un DateTime ( DateTime?) anulable en a DateTime, pero recibo un error:

No se puede convertir implícitamente el tipo 'System.DateTime?' a 'System.DateTime'. Existe una conversión explícita (¿te falta un yeso?)

He intentado lo siguiente:

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

Respuestas:

304

Desea utilizar el operador de fusión nula , que está diseñado exactamente para este propósito.

Al usarlo, terminas con este código.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
escalofríos42
fuente
1
Aquí hay un fragmento que utilicé dentro de un Presentador que llena una vista con una Fecha / Hora Anulable: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram
'¿Fecha y hora?' la dosis no contiene la definición de 'ActualizaciónDate'
Vasil Valchev
88

MS ya creó un método para esto, por lo que no tiene que usar el operador de fusión nula. No hay diferencia en la funcionalidad, pero es más fácil para los no expertos obtener lo que está sucediendo de un vistazo.

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

Prueba esto

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
Valentin Vasilyev
fuente
La clave aquí es el operador de fusión nula, consulte la respuesta de chills42 para obtener más información.
cspolton
24

Puedes usar un elenco simple:

DateTime dtValue = (DateTime) dtNullAbleSource;

Como dijo Leandro Tupone, debe verificar si la var es nula antes

César León
fuente
66
Perfecto si comprueba si la var es nula antes de +1
Leandro
22

Debe llamar a la propiedad Value del DateTime anulable. Esto devolverá un DateTime.

Suponiendo que UpdatedDatees así DateTime?, entonces esto debería funcionar:

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

Para que el código sea un poco más fácil de leer, puede usar la propiedad HasValue en lugar de la nullcomprobación:

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

Esto se puede hacer aún más conciso:

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
adrianbanks
fuente
6

¿Qué tal lo siguiente:

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

Aquí hay un fragmento que utilicé dentro de un presentador que llena una vista con una fecha / hora anulable

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

También puede probar las propiedades Nullable (T) :

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

Considere usar lo siguiente, que es mucho mejor que la respuesta aceptada

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;
Sadiqabbas Hirani
fuente
¿Te importa decir por qué es mejor?
n4rzul
0

Prueba esto:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Tim S. Van Haren
fuente
0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;
Vyas duras
fuente
44
Normalmente se considera buena forma de explicar sus sugerencias / respuestas. Las respuestas de solo código pueden ser sorprendentemente poco informativas, incluso si son técnicamente correctas.
Maximilian Ast
1
@MaximilianAst sí, tienes razón, intentará implementar la forma que has sugerido :)
Harsh Vyas