DateTime "null" значение

Я много искал, но не нашел решения. Как вы работаете с DateTime, который должен содержать неинициализированное значение (эквивалентное null)? У меня есть класс, который может иметь значение свойства DateTime или нет. Я думал об инициализации владельца недвижимости DateTime.MinValue, который затем можно было легко проверить. Я думаю, это довольно распространенный вопрос, как вы это делаете?

Ответ 1

Для обычных DateTimes, если вы вообще не инициализируете их, они будут соответствовать DateTime.MinValue, потому что это тип значения, а не ссылочный тип.

Вы также можете использовать нулевое значение DateTime, например:

DateTime? MyNullableDate;

Или более длинная форма:

Nullable<DateTime> MyNullableDate;

И, наконец, существует встроенный способ ссылки на умолчания любого типа. Это возвращает null для ссылочных типов, но для нашего примера DateTime оно будет возвращаться так же, как DateTime.MinValue:

default(DateTime)

Ответ 2

Если вы используете .NET 2.0 (или более позднюю версию), вы можете использовать тип с нулевым значением:

DateTime? dt = null;

или

Nullable<DateTime> dt = null;

а затем:

dt = new DateTime();

И вы можете проверить значение с помощью:

if (dt.HasValue)
{
  // Do something with dt.Value
}

Или вы можете использовать его как:

DateTime dt2 = dt ?? DateTime.MinValue;

Вы можете прочитать больше здесь:
http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx

Ответ 3

DateTime? MyDateTime {получить, установить;}

MyDateTime = (dr["f1"] == DBNull.Value) ? (DateTime?)null : ((DateTime)dr["f1"]);

Ответ 4

Следующий способ также работает

myClass.PublishDate = toPublish ? DateTime.Now : (DateTime?)null;

Обратите внимание, что свойство PublishDate должно быть DateTime?

Ответ 6

Вы можете использовать класс с нулевым значением.

DateTime? date = new DateTime?();

Ответ 7

Для этого можно использовать значение NULL для DateTime.

Nullable<DateTime> myDateTime;

или то же самое, что написано так:

DateTime? myDateTime;

Ответ 8

Стоит отметить, что, хотя переменная DateTime не может быть null, ее по-прежнему можно сравнить с null без ошибки компилятора:

DateTime date;
...
if(date == null) // <-- will never be 'true'
  ...

Ответ 9

Я всегда устанавливаю время DateTime.MinValue. Таким образом, я не получаю исключение NullErrorException, и я могу сравнить его с датой, которая, как я знаю, не установлена.

Ответ 10

Вы можете установить DateTime в Nullable. По умолчанию DateTime не обнуляется. Вы можете сделать его обнуляемым несколькими способами. Использование знака вопроса после типа DateTime? myTime или использование универсального стиля Nullable.

DateTime? nullDate = null;

или

DateTime? nullDate;

Ответ 11

Просто будьте осторожны - при использовании Nullable он явно не является "чистым" объектом datetime, поэтому вы не можете напрямую обращаться к членам DateTime. Я попробую и объясню.

Используя Nullable < > вы в основном обертываете DateTime в контейнере (благодарю вас, дженерики), из которых имеет значение NULL - очевидно, его цель. Этот контейнер имеет свои собственные свойства, которые вы можете вызвать, что обеспечит доступ к вышеупомянутому объекту 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: Удалена третья опция, поскольку она была немного чрезмерно конкретной и зависящей от случая.

Ответ 12

Хотя каждый уже дал вам ответ, я упомянул способ, который упрощает передачу даты и времени в функцию

[ОШИБКА: невозможно преобразовать system.datetime? to system.datetime]

DateTime? dt = null;
DateTime dte = Convert.ToDateTime(dt);

Теперь вы можете передать dte внутри функции без каких-либо проблем.

Ответ 13

Если вы, иногда, ожидаете null, вы можете использовать что-то вроде этого:

var orderResults = Repository.GetOrders(id, (DateTime?)model.DateFrom, (DateTime?)model.DateTo)

В вашем репозитории используется нулевое datetime.

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}

Ответ 14

У меня была та же проблема, что и я должен был предоставить Null в качестве параметра для DateTime при выполнении Unit test для Throws ArgumentNullException.It работал в моем случае, используя следующий параметр:

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));

Ответ 15

Учитывая характер типа данных даты/времени, он не может содержать значение null, т.е. он должен содержать значение, оно не может быть пустым или не содержать ничего. Если вы помечаете переменную даты/времени как nullable, тогда вы можете присвоить ей нулевое значение. Так что вы хотите сделать, это одна из двух вещей (может быть больше, но я могу только думать о двух):

  • Назначьте минимальную дату/время для вашей переменной, если у вас нет значения для нее. Вы также можете назначить максимальное значение даты/времени - в зависимости от того, что вам подходит. Просто убедитесь, что вы согласованы по всему сайту, проверяя ваши значения даты/времени. Решите, используя min или max и придерживайтесь его.

  • Отметьте свою переменную даты/времени как nullable. Таким образом вы можете установить свою переменную даты/времени на null, если у вас нет переменной.

Позвольте мне продемонстрировать свою первую точку, используя пример. Тип переменной DateTime не может быть установлен в null, ему нужно значение, в этом случае я собираюсь установить его минимальное значение DateTime, если нет значения.

Мой сценарий состоит в том, что у меня есть класс BlogPost. Он имеет много разных полей/свойств, но я решил использовать только два для этого примера. DatePublished - это когда публикация была опубликована на веб-сайте и должна содержать значение даты/времени. DateModified - это когда сообщение изменено, поэтому оно не должно содержать значения, но может содержать значение.

public class BlogPost : Entity
{
     public DateTime DateModified { get; set; }

     public DateTime DatePublished { get; set; }
}

Используя ADO.NET, чтобы получить данные из базы данных (присваивать DateTime.MinValue нет значения):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? DateTime.MinValue : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

Вы можете выполнить мою вторую точку, пометив поле DateModified как nullable. Теперь вы можете установить его на null, если для него нет значения:

public DateTime? DateModified { get; set; }

Используя ADO.NET для получения данных из базы данных, он будет немного отличаться от того, как это было сделано выше (назначая null вместо DateTime.MinValue):

BlogPost blogPost = new BlogPost();
blogPost.DateModified = sqlDataReader.IsDBNull(0) ? (DateTime?)null : sqlDataReader.GetFieldValue<DateTime>(0);
blogPost.DatePublished = sqlDataReader.GetFieldValue<DateTime>(1);

Надеюсь, это поможет устранить любую путаницу. Учитывая, что мой ответ примерно через 8 лет, вы, вероятно, являетесь экспертом по программированию на С#: