【问题标题】:To get the date difference between a datetime and nullable datetime获取日期时间和可为空的日期时间之间的日期差异
【发布时间】:2023-03-26 04:10:01
【问题描述】:

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

我的代码:

型号:

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“时间跨度?”不包含“Days”的定义,并且没有可访问的扩展方法“Days”接受“TimeSpan”类型的第一个参数?可以找到(您是否缺少 using 指令或程序集引用?)

我做错了什么?

【问题讨论】:

  • 如果其中一个日期时间为空,结果应该是什么?
  • 为什么它需要可以为空?你可以检查 DateTime = DateTime.MinValue
  • 改用model.Date2 ?? today。问题是当Date2 不为空时,您仍然在计算中使用DateTime?,这会导致TimeSpan?
  • 尝试将(model.Date2 != null ? model.Date2 : today)改为(model.Date2.HasValue ? model.Date2.Value : today)
  • 您可以添加可选导航 (task.DueDate - DateTime.Now)?.Days 它应该可以正常工作

标签: c# asp.net-mvc datetime


【解决方案1】:

TimeSpan? 表示Nullable<TimeSpan>,它与TimeSpan 的结构不同,它没有Days 属性。

取而代之的是,您可以使用它的Value property,并且可以在它喜欢之后调用它的Days

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

或者作为commented by juharr,你可以使用model.Date2 ?? today,它返回model.Date2 如果它不是null,或者如果model.Date2null,则返回today

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

【讨论】:

  • 最好使用model.Date2 ?? today 并完全避免使用TimeSpan?
  • @juharr 谢谢,也提到了。
【解决方案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);
}

【讨论】:

    【解决方案3】:

    您可以使用空合并运算符 (??) 来确保您在这样的计算中使用了一个不可为空的值。

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

    这确保计算是在两个DateTimes 上完成的,而不是在DateTimeDateTime? 上完成。当计算中的一个值可以为空时,结果将可以为空。

    【讨论】:

      【解决方案4】:

      我建议将您的逻辑移到模型中并使用空合并运算符:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多