获取日期时间和可为空的日期时间之间的日期差

时间:2019-05-28 14:21:31

标签: c# asp.net-mvc datetime

我有两个日期,其中一个字段是日期时间字段,另一个字段是可空的日期时间字段。我想从日期1中减去date2,如果date2为null,则从今天开始减去它。

我的代码:

型号:

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 个答案:

答案 0 :(得分:2)

TimeSpan?的意思是Nullable<TimeSpan>,它与TimeSpan的结构不同,并且没有Days属性。

相反,您可以使用它的Value property并在其后使用Days

model.Diff = (model.Date1 - (model.Date2 != null ? model.Date2 : today)).Value.Days; 

或者像juharr的commented一样,您可以使用model.Date2 ?? today返回model.Date2 如果不是null或返回today如果model.Date2喜欢null

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

答案 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 = (int)(model.Date1 - (model.Date2 ?? today)).TotalDays;
    return View(model);
}

答案 2 :(得分:2)

您可以使用空合并运算符(??)来确保在计算中使用非空值。

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

这确保了计算是在两个DateTime而不是DateTimeDateTime?上完成的。如果计算中的一个值可为空,则结果将为可空。

答案 3 :(得分:1)

我建议在模型中移动逻辑并使用空合并运算符:

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);
}