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;

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;

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

43

Tente isto

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

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


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;

6

Que tal o seguinte:

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

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


1

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

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

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;

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.