Как конвертировать 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.