Como converter DateTime? até DateTime

171

Quero converter um DateTime ( DateTime?) anulável em um DateTime, mas estou recebendo um erro:

Não é possível converter implicitamente o tipo 'System.DateTime?' para 'System.DateTime'. Existe uma conversão explícita (você está perdendo um elenco?)

Eu tentei o seguinte:

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

Respostas:

304

Você deseja usar o operador de coalescência nula , projetado exatamente para esse fim.

Usando ele, você acaba com esse código.

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
calafrios42
fonte
1
Aqui está um trecho I usado dentro de um Apresentador preenchendo uma vista com um Nullable Data / Hora: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Ravi Ram
'Data hora?' dose não contém definição para 'UpdatedDate'
Vasil Valchev
88

A Microsoft já criou um método para isso, então você não precisa usar o operador coalescente nulo. Não há diferença na funcionalidade, mas é mais fácil para os não especialistas entenderem o que está acontecendo rapidamente.

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

Tente isto

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate ?? DateTime.Now;
Valentin Vasilyev
fonte
O principal aqui é o operador de coalescência nula; consulte a resposta de chills42 para obter mais informações.
Cspolton
24

Você pode usar um elenco simples:

DateTime dtValue = (DateTime) dtNullAbleSource;

Como Leandro Tupone disse, você deve verificar se o var é nulo antes

César León
fonte
6
Perfeito se você verificar se o var é nulo antes de +1
Leandro
22

Você precisa chamar a propriedade Value do DateTime anulável. Isso retornará um DateTime.

Supondo que UpdatedDateseja DateTime?, então isso deve funcionar:

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

Para facilitar a leitura do código, você pode usar a propriedade HasValue em vez da nullverificação:

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

Isso pode ser feito ainda mais conciso:

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

Que tal o seguinte:

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

Aqui está um trecho que eu usei dentro de um Presenter preenchendo uma exibição com uma Data / Hora Anulável

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

Você também pode tentar Propriedades Nullable (T) :

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

Considere usar o seguinte, que é muito melhor do que a resposta aceita

DateTime UpdatedTime = _objHotelPackageOrder.UpdatedDate == null 
    ? DateTime.Now : (DateTime)_objHotelPackageOrder.UpdatedDate;
Sadiqabbas Hirani
fonte
Gostaria de dizer por que é melhor?
N4rzul 9/12/19
0

Tente o seguinte:

DateTime UpdatedTime = (DateTime)_objHotelPackageOrder.UpdatedDate == null ? DateTime.Now : _objHotelPackageOrder.UpdatedDate.Value;
Tim S. Van Haren
fonte
0
DateTime UpdatedTime = _objHotelPackageOrder.HasValue ? _objHotelPackageOrder.UpdatedDate.Value : DateTime.Now;
Harsh Vyas
fonte
4
Normalmente, é considerado uma boa forma explicar suas sugestões / respostas. As respostas apenas de código podem ser surpreendentemente pouco informativas, mesmo que sejam tecnicamente corretas.
Maximilian Ast
1
@MaximilianAst sim você está certo vai tentar implementar a maneira que você sugeriu :)
Harsh Vyas