У меня есть две даты, где одно поле является полем даты и времени, а другое - полем даты и времени с нулевым значением. Я хочу вычесть дату2 из даты 1, и если дата2 равна нулю, вычесть ее с сегодняшнего дня.
Мой код:
Модель:
public class SampleViewModel
{
public DateTime Date1 {get;set;}
public DateTime? Date2 {get;set;}
public int Diff {get;set;}
}
Действие контроллера:
public ActionResult Index()
{
var today = DateTime.Now;
SampleViewModel model = new SampleViewModel();
model.Date1=today;
model.Date2 = today.AddDays(5);
model.Diff = (model.Date1 - (model.Date2 != null ? model.Date2 : today)).Days;//Error
return View(model);
}
Я получаю ошибку компиляции
Error CS1061 'TimeSpan?' does not contain a definition for 'Days' and no accessible extension method 'Days' accepting a first argument of type 'TimeSpan?' could be found (are you missing a using directive or an assembly reference?)
Что я делаю неправильно?
Почему он должен быть обнуляемым? Вы можете просто проверить DateTime = DateTime.MinValue
Вместо этого попробуйте model.Date2 ?? today
. Проблема в том, что вы все еще используете DateTime?
в расчетах, когда Date2
не равно нулю, что приводит к TimeSpan?
.
Попробуйте заменить (model.Date2 != null ? model.Date2 : today)
на (model.Date2.HasValue ? model.Date2.Value : today)
.
вы можете просто добавить дополнительную навигацию (task.DueDate - DateTime.Now)?.Days
она должна работать нормально
TimeSpan?
означает Nullable<TimeSpan>
, структура которого отличается от TimeSpan
и не имеет свойства Days
.
Вместо этого вы можете использовать его Value
недвижимость, и вы можете назвать его Days
после того, как он нравится;
model.Diff = (model.Date1 - (model.Date2 != null ? model.Date2 : today)).Value.Days;
Или как прокомментировал от juharr, вы можете использовать model.Date2 ?? today
, который возвращает model.Date2
если, это не null
, или возвращает today
, если model.Date2
похож на null
;
model.Diff = (model.Date1 - (model.Date2 ?? today)).Days;
Еще лучше использовать model.Date2 ?? today
и вообще избегать TimeSpan?
.
@juharr Спасибо, я тоже это упомянул.
public class SampleViewModel
{
public DateTime Date1 {get;set;}
public DateTime? Date2 {get;set;}
public int Diff {get;set;}
}
public ActionResult Index()
{
var today = DateTime.Now;
SampleViewModel model = new SampleViewModel();
model.Date1=today;
model.Date2 = today.AddDays(5);
model.Diff = (int)(model.Date1 - (model.Date2 ?? today)).TotalDays;
return View(model);
}
Вы можете использовать оператор объединения с нулевым значением (??
), чтобы убедиться, что вы используете ненулевое значение в расчете, подобном этому.
model.Diff = (model.Date1 - (model.Date2 ?? today)).Days;
Это гарантирует, что расчет выполняется с двумя DateTime
вместо DateTime
и DateTime?
. Когда одно значение в расчете может быть обнулено, результат будет обнуляемым.
Я бы предложил переместить вашу логику внутри вашей модели и использовать оператор объединения null:
public class SampleViewModel
{
public SampleViewModel(DateTime date1, DateTime? date2 = null){
Date1 = date1;
Date2 = date2;
}
public DateTime Date1 { get; set; }
public DateTime? Date2 { get; set; }
public int Diff => (Date1 - (Date2 ?? DateTime.Now)).Days;
}
Применение:
public ActionResult Index()
{
var today = DateTime.Now;
var model = new SampleViewModel(today, today.AddDays(5));
return View(model);
}
Если одно из значений даты и времени равно нулю, каким должен быть результат?