Чтобы получить разницу в дате между datetime и nullable datetime

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

Что я делаю неправильно?

Если одно из значений даты и времени равно нулю, каким должен быть результат?

user47589 28.05.2019 16:23

Почему он должен быть обнуляемым? Вы можете просто проверить DateTime = DateTime.MinValue

McNline 28.05.2019 16:23

Вместо этого попробуйте model.Date2 ?? today. Проблема в том, что вы все еще используете DateTime? в расчетах, когда Date2 не равно нулю, что приводит к TimeSpan?.

juharr 28.05.2019 16:23

Попробуйте заменить (model.Date2 != null ? model.Date2 : today) на (model.Date2.HasValue ? model.Date2.Value : today).

Rumpelstinsk 28.05.2019 16:23

вы можете просто добавить дополнительную навигацию (task.DueDate - DateTime.Now)?.Days она должна работать нормально

calios 02.06.2020 16:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
2 213
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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 28.05.2019 16:26

@juharr Спасибо, я тоже это упомянул.

Soner Gönül 28.05.2019 16:32
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);
}

Другие вопросы по теме