DateTime "нулевое" значение - PullRequest
       69

DateTime "нулевое" значение

248 голосов
/ 21 октября 2008

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

Ответы [ 15 ]

3 голосов
/ 28 января 2016

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

Используя Nullable <>, вы в основном оборачиваете DateTime в контейнер (спасибо вам обобщенные), который можно обнулять - очевидно, его цель. Этот контейнер имеет свои собственные свойства, которые вы можете вызвать, что обеспечит доступ к вышеупомянутому объекту DateTime; после использования правильного свойства - в данном случае Nullable.Value - вы получаете доступ к стандартным элементам DateTime, свойствам и т. д.

Итак - теперь возникает вопрос о том, как лучше всего получить доступ к объекту DateTime. Есть несколько способов, номер 1 от FAR лучший, а 2 - «чувак почему».

  1. Используя свойство Nullable.Value,

    DateTime date = myNullableObject.Value.ToUniversalTime(); //Works

    DateTime date = myNullableObject.ToUniversalTime(); //Not a datetime object, fails

  2. Преобразование обнуляемого объекта в datetime с использованием Convert.ToDateTime (),

    DateTime date = Convert.ToDateTime(myNullableObject).ToUniversalTime(); //works but why...

Хотя на данный момент ответ хорошо документирован, я думаю, что использование Nullable, вероятно, стоило опубликовать. Извините, если вы не согласны.

edit: удален третий вариант, так как он был слишком специфичным и зависящим от регистра.

2 голосов
/ 18 июля 2016

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

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

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

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

1 голос
/ 18 февраля 2017

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

Assert.Throws<ArgumentNullException>(()=>sut.StartingDate = DateTime.Parse(null));
1 голос
/ 14 мая 2013

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

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

В вашем хранилище используйте null-способны дату и время.

public Orders[] GetOrders(string id, DateTime? dateFrom, DateTime? dateTo){...}
0 голосов
/ 26 июля 2016

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

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

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

Позвольте мне продемонстрировать мой первый пункт на примере. Тип переменной DateTime не может быть установлен равным нулю, ему нужно значение, в этом случае я собираюсь установить его на минимальное значение 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 лет, вы, вероятно, уже являетесь опытным программистом C #:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...