Как конвертировать DateTime? в DateTime


171

Я хочу преобразовать обнуляемый DateTime ( DateTime?) в DateTime, но я получаю ошибку:

Не удается неявно преобразовать тип 'System.DateTime?' в «System.DateTime». Существует явное преобразование (вам не хватает приведения?)

Я попытался следующее:

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

Ответы:


304

Вы хотите использовать оператор объединения нулей , который предназначен именно для этой цели.

Используя его, вы получите этот код.

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

1
Вот фрагмент кода, который я использовал в Докладчике, заполняющий представление с помощью Обнуляемой даты / времени: memDateLogin = m.memDateLogin ?? DateTime.MinValue
Рави Рам

"DateTime? доза не содержит определения для «Обновленной даты»
Василь

88

MS уже сделала метод для этого, так что вам не нужно использовать оператор объединения нулей. Нет различий в функциональности, но неспециалистам легче понять происходящее с первого взгляда.

DateTime updatedTime = _objHotelPackageOrder.UpdatedDate.GetValueOrDefault(DateTime.Now);

43

Попробуй это

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

Ключевым моментом здесь является оператор слияния нуля, более подробную информацию смотрите в ответе chills42.
Cspolton

24

Вы можете использовать простое приведение:

DateTime dtValue = (DateTime) dtNullAbleSource;

Как сказал Леандро Тупоне, вы должны проверить, является ли переменная нулевой, прежде чем


6
Идеально, если вы проверяете, является ли
Леандро

22

Вам нужно вызвать свойство Value обнуляемого DateTime. Это вернет DateTime.

Предполагая, что UpdatedDateэто так DateTime?, тогда это должно работать:

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

Чтобы сделать код немного проще для чтения, вы можете использовать свойство HasValue вместо nullпроверки:

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

Это можно сделать еще более кратким:

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

6

Как насчет следующего:

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

6

Вот фрагмент, который я использовал в Presenter, заполняя представление со значением Nullable Date / Time

memDateLogin = m.memDateLogin ?? DateTime.MinValue


1

Рассмотрите возможность использования следующего, который намного лучше, чем принятый ответ

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

Не хочешь сказать, почему это лучше?
n4rzul


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

4
Обычно считается хорошей формой для объяснения ваших предложений / ответов. Код только ответы могут быть удивительно неинформативными, даже если они являются технически правильными.
Максимилиан Аст

1
@MaximilianAst Да, вы правы, постараетесь реализовать то, что вы предложили :)
Harsh Vyas
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.