Я много искал, но не смог найти решение. Как вы справляетесь с DateTime, который должен содержать неинициализированное значение (эквивалентное нулю)? У меня есть класс, который может иметь значение свойства DateTime или нет. Я думал об инициализации владельца свойства DateTime.MinValue, который затем можно было легко проверить. Я думаю, это довольно распространенный вопрос, как ты это делаешь?
273
DateTime.MinValue
а такжеMyNullableDate=date;
будет установить его,MyDate = MyNullableDate.Value;
прочитать из него иif(MyNullableDate.HasValue)
проверить, является ли он нулевымЕсли вы используете .NET 2.0 (или более позднюю версию), вы можете использовать обнуляемый тип:
или
тогда позже:
И вы можете проверить значение с:
Или вы можете использовать его как:
Вы можете прочитать больше здесь:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx
источник
dt.GetValueOrDefault()
- это самый эффективный вариант.DateTime? MyDateTime {получить; набор;}
источник
null
не работает. Это должно быть(DateTime?)null
.Следующий способ работает также
Обратите внимание, что свойство PublishDate должно быть DateTime?
источник
Я хотел бы рассмотреть возможность использования обнуляемых типов .
DateTime? myDate
вместоDateTime myDate
.источник
Стоит отметить, что, хотя
DateTime
переменная не может бытьnull
, ее все равно можно сравнитьnull
без ошибки компилятора:источник
Вы можете использовать обнуляемый класс.
источник
DateTime
. Как уже упоминалось ранее,new DateTime()
эффективно даст вам,DateTime.Min
тогда какnew DateTime?()
приведет к нулю.Вы можете использовать обнуляемый DateTime для этого.
или то же самое написано так:
источник
Вы можете установить DateTime в Nullable. По умолчанию DateTime не обнуляется. Вы можете сделать его обнуляемым несколькими способами. Использование знака вопроса после типа DateTime? myTime или используя общий стиль Nullable.
или
источник
Я всегда установить время
DateTime.MinValue
. Таким образом, я не получаю никакого исключения NullErrorException и могу сравнить его с датой, которую я знаю, не установлено.источник
Только предупреждаем - при использовании Nullable он, очевидно, больше не является «чистым» объектом даты и времени, поэтому вы не можете напрямую обращаться к членам DateTime. Я постараюсь объяснить.
Используя Nullable <>, вы в основном оборачиваете DateTime в контейнер (спасибо generics), который является nullable - очевидно, его цель. Этот контейнер имеет свои собственные свойства, которые вы можете вызывать, чтобы обеспечить доступ к вышеупомянутому объекту DateTime; после использования правильного свойства - в данном случае Nullable.Value - вы получаете доступ к стандартным элементам DateTime, свойствам и т. д.
Итак - теперь возникает вопрос о том, как лучше всего получить доступ к объекту DateTime. Есть несколько способов, номер 1 от FAR лучший и 2 "чувак почему".
Используя свойство Nullable.Value,
DateTime date = myNullableObject.Value.ToUniversalTime(); //Works
DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails
Преобразование обнуляемого объекта в datetime с использованием Convert.ToDateTime (),
DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...
Хотя на данный момент ответ хорошо документирован, я думаю, что использование Nullable, вероятно, стоило опубликовать. Извините, если вы не согласны.
edit: удален третий вариант, так как он был слишком специфичным и зависящим от регистра.
источник
Хотя все уже дали вам ответ, я упомяну способ, который облегчает передачу datetime в функцию
[ОШИБКА: невозможно преобразовать system.datetime? to system.datetime]
Теперь вы можете передать dte внутри функции без каких-либо проблем.
источник
Если вы иногда ожидаете null, вы можете использовать что-то вроде этого:
В вашем репозитории используйте null-способную дату и время.
источник
У меня была та же проблема, что и для задания значения DateTime в качестве параметра для DateTime, когда я выполнял модульный тест для Throws ArgumentNullException. В моем случае это работало с использованием следующей опции:
источник
Учитывая природу типа данных даты / времени, он не может содержать
null
значение, то есть он должен содержать значение, он не может быть пустым или ничего не содержать. Если вы помечаете переменную даты / времени какnullable
только тогда, вы можете присвоить ей нулевое значение. Итак, что вы хотите сделать, это одна из двух вещей (может быть больше, но я могу думать только о двух):Назначьте минимальное значение даты / времени для вашей переменной, если у вас нет значения для нее. Вы также можете назначить максимальное значение даты / времени - в зависимости от того, что вам подходит. Просто убедитесь, что вы едины для всего сайта при проверке значений даты / времени. Определитесь с использованием
min
илиmax
и придерживайтесь его.Пометьте свою переменную даты / времени как
nullable
. Таким образом, вы можете установить переменную даты / времени,null
если у вас нет этой переменной.Позвольте мне продемонстрировать мой первый пункт на примере. Тип
DateTime
переменной не может быть установлен в нуль, ему нужно значение, в этом случае я собираюсь установить его наDateTime
минимальное значение, если значение отсутствует.Мой сценарий таков, что у меня есть
BlogPost
класс. У него много разных полей / свойств, но я выбрал только два для этого примера.DatePublished
когда сообщение было опубликовано на веб-сайте и должно содержать значение даты / времени.DateModified
это когда сообщение модифицируется, поэтому оно не должно содержать значение, но может содержать значение.Использование
ADO.NET
для получения данных из базы данных (назначитьDateTime.MinValue
, если значение отсутствует):Вы можете выполнить мой второй пункт, пометив
DateModified
поле какnullable
. Теперь вы можете установить его,null
если для него нет значения:Использование
ADO.NET
для получения данных из базы данных, это будет выглядеть немного иначе, чем это было сделано выше (назначениеnull
вместоDateTime.MinValue
):Я надеюсь, что это поможет прояснить ситуацию. Учитывая, что мой ответ через 8 лет, вы, вероятно, уже являетесь опытным программистом C # :)
источник