Чтобы получить разницу в дате между datetime и nullable datetime - PullRequest
0 голосов
/ 28 мая 2019

У меня есть две даты, где одно поле является полем даты и времени, а другое - полем даты и времени, обнуляемым.Я хочу вычесть дату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);
}

Я получаю ошибку компиляции

Ошибка CS1061 'TimeSpan?'не содержит определения для «Дней» и доступного метода расширения «Дни», принимающего первый аргумент типа «TimeSpan?»может быть найдено (вам не хватает директивы using или ссылки на сборку?)

Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 28 мая 2019
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);
}
2 голосов
/ 28 мая 2019

Вы можете использовать нулевой оператор объединения (??), чтобы убедиться, что вы используете необнуляемое значение в расчете, как это.

model.Diff = (model.Date1 - (model.Date2 ?? today)).Days;

Это гарантирует, что вычисление будет выполнено для двухDateTime с вместо DateTime и DateTime?.Когда одно значение в вычислении обнуляется, результат будет обнуляемым.

2 голосов
/ 28 мая 2019

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 like;

model.Diff = (model.Date1 - (model.Date2 ?? today)).Days;
1 голос
/ 28 мая 2019

Я бы предложил переместить вашу логику в вашу модель и использовать оператор объединения нулей:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...