Я много искал, но не нашел решения. Как вы работаете с DateTime, который должен содержать неинициализированное значение (эквивалентное null)? У меня есть класс, который может иметь значение свойства DateTime или нет. Я думал об инициализации владельца недвижимости DateTime.MinValue, который затем можно было легко проверить. Я думаю, это довольно распространенный вопрос, как вы это делаете?
DateTime "null" значение
Ответ 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?
Ответ 5
Я бы подумал об использовании типов с нулевым значением.
DateTime? myDate
DateTime? myDate
вместо DateTime myDate
.
Ответ 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 лет, вы, вероятно, являетесь экспертом по программированию на С#: