【问题标题】:Calculate difference between two dates (number of days)?计算两个日期(天数)之间的差异?
【发布时间】:2010-12-09 02:30:21
【问题描述】:

我看到 JavaJavaScriptPHP 已经回答了这个问题,但 C# 没有。那么,如何在 C# 中计算两个日期之间的天数?

【问题讨论】:

  • 我发现这真的很有用.. getting a list of dates between start date and end date 希望这可以帮助任何人在未来特别寻求这个:)
  • 加法和减法运算符对DateTimeTimeSpan 类型进行了重载,如您所料。这一切都很简单。 -- 你到底遇到了什么问题?
  • int TotalDays = (YourEndDate - YourStartDate).TotalDays

标签: c# date


【解决方案1】:

试试这个真正有效的获取实际天数差异。日期格式为“dd/MM/yyyy”

  string[] d1 = txtFromDate.Values.Split('/');
  string[] d2 = txtToDate.Values.Split('/');

  DateTime FrmDt = new DateTime(Convert.ToInt32(d1[2]), Convert.ToInt32(d1[1]), Convert.ToInt32(d1[0]));
  DateTime ToDt = new DateTime(Convert.ToInt32(d2[2]), Convert.ToInt32(d2[1]), Convert.ToInt32(d2[0]));

  TimeSpan TDiff = ToDt.Subtract(FrmDt);
  String DaysDiff = TDiff.TotalDays.ToString();

【讨论】:

  • DateTime.ParseExact 存在。您可以指定格式,而无需手动解析。此答案不会添加现有答案尚未提供的任何内容。
【解决方案2】:

在计算两个日期之间的天数时,通常会就时间(小时)进行辩论。对问题的回答和他们的 cmets 也不例外。

考虑到StartDateEndDate 属于DateTime 类型:如果性能不是问题,我强烈建议您通过中间转换记录您的计算。例如,(EndDate - StartDate).Days 不直观,因为舍入取决于StartDateEndDate 的小时部分。

  • 如果您希望以天为单位的持续时间包括天数的小数部分,那么就像已经建议的那样 使用(EndDate - StartDate).TotalDays
  • 如果您想反映持续时间 两天之间的距离,然后使用(EndDate.Date - StartDate.Date).Days
  • 如果您希望持续时间反映 开始日期的早上和晚上之间的持续时间 结束日期(您通常在项目管理软件中看到的),然后使用 (EndDate.Date - StartDate.Date).Days + 1

【讨论】:

    【解决方案3】:

    最佳答案是正确的,但是如果您只想将整天作为 int 并且愿意放弃日期的时间部分,请考虑:

    (EndDate.Date - StartDate.Date).Days
    

    再次假设 StartDateEndDate 的类型为 DateTime

    【讨论】:

    • 最佳答案,因为 "numbers of days" 通常表示一整天。值得注意的是,Days 不会在 365 处停止(就像其他属性一样,HoursMinutesSecond,其中 nax 值是下一个更高属性开始的位置)。它与TotalDays 相同,但没有一天的小数部分并返回int 而不是double
    • 这会一直按预期工作吗?例如,如果要比较的某一天是“提前”夏令时日,那么减法是否会产生 23 小时的 TimeSpan,如果是,那么 .Days 在该 23 小时时间跨度上的值是否为 0 ? (我自己尝试过这个实验,但到目前为止我的结果尚无定论 - stackoverflow.com/questions/43644252/…
    • 是的,这就是我需要的——最有价值的答案 cmon 现在没有人愿意在计算天数时考虑分秒
    • 如果只过了 1,5 天,这个 .Days 函数会只显示 1 天吗?我如何将其更改为显示 2 天?我只需要总是添加 + 1 天?
    • 对此表示赞同,因为您经常需要“两个日期之间的日历天数”,而不仅仅是“24 小时间隔数”。例如,您需要在时间轴中显示“X 天前”标签。在这种情况下,“星期一晚上 11:59”和“星期二早上 7:00”之间的差异应该是“1 天(前)”......所以 .Date 部分非常有用。希望我说清楚
    【解决方案4】:
    // Difference in days, hours, and minutes.
    
    TimeSpan ts = EndDate - StartDate;
    
    // Difference in days.
    
    int differenceInDays = ts.Days; // This is in int
    double differenceInDays= ts.TotalDays; // This is in double
    
    // Difference in Hours.
    int differenceInHours = ts.Hours; // This is in int
    double differenceInHours= ts.TotalHours; // This is in double
    
    // Difference in Minutes.
    int differenceInMinutes = ts.Minutes; // This is in int
    double differenceInMinutes= ts.TotalMinutes; // This is in double
    

    您还可以获得秒、毫秒和滴答声的差异。

    【讨论】:

      【解决方案5】:

      使用时间跨度可以解决问题,因为它有很多属性:

      DateTime strt_date = DateTime.Now;
      DateTime end_date = Convert.ToDateTime("10/1/2017 23:59:59");
      //DateTime add_days = end_date.AddDays(1);
      TimeSpan nod = (end_date - strt_date);
      Console.WriteLine(strt_date + "" + end_date + "" + "" + nod.TotalHours + "");
      Console.ReadKey();
      

      【讨论】:

        【解决方案6】:

        对于像我这样会偶然发现这个小问题的初学者,只需简单的一行,将示例转换为 int

        int totalDays = Convert.ToInt32((DateTime.UtcNow.Date - myDateTime.Date).TotalDays);
        

        这会计算从今天 (DateTime.UtcNow.Date) 到所需日期 (myDateTime.Date) 的总天数。

        如果 myDateTime 是昨天,或者比今天更早的日期,这将给出一个正 (+) 整数结果。

        另一方面,如果 myDateTime 是明天或未来日期,由于加法规则,这将给出负 (-) 整数结果。

        编码愉快! ^_^

        【讨论】:

        • 你不能只使用“Days”而不是投射 TotalDays 吗?该转换甚至没有舍入,它只是截断。如果 TotalDays 是 1.99,您的解决方案将给出 1(这可能是您想要的)。
        【解决方案7】:

        获取两个日期之间的差,然后获取日期:

        int total_days = (EndDate - StartDate).TotalDays
        

        【讨论】:

        • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性 cmets 挤满你的代码,因为这会降低代码和解释的可读性!
        • TotalDays 返回双精度:msdn.microsoft.com/en-us/library/… 所以你需要转换为 int
        【解决方案8】:

        您可以使用以下代码:

         int DateDifInSecond = EndDate.Subtract(StartDate).TotalSeconds
        

        【讨论】:

          【解决方案9】:

          先声明一个稍后会返回的类:

          public void date()
          {
              Datetime startdate;
              Datetime enddate;
              Timespan remaindate;
          
              startdate = DateTime.Parse(txtstartdate.Text).Date;
              enddate = DateTime.Parse(txtenddate.Text).Date;
          
              remaindate = enddate - startdate;
          
              if (remaindate != null)
              {
                  lblmsg.Text = "you have left with " + remaindate.TotalDays + "days.";
              }
              else
              {
                  lblmsg.Text = "correct your code again.";
              }
          }
          
          protected void btncal_Click(object sender, EventArgs e)
          {
              date();
          }
          

          使用按钮控件调用上述类。这是一个例子:

          【讨论】:

            【解决方案10】:

            对于ab 作为两个DateTime 类型:

            DateTime d = DateTime.Now;
            DateTime c = DateTime.Now;
            c = d.AddDays(145);
            string cc;
            Console.WriteLine(d);
            Console.WriteLine(c);
            var t = (c - d).Days;
            Console.WriteLine(t);
            cc = Console.ReadLine();
            

            【讨论】:

              【解决方案11】:

              你可以试试这个

              EndDate.Date.Subtract(DateTime.Now.Date).Days
              

              【讨论】:

              • 这实际上对我帮助最大,因为我的日期差是半天,但是当美国比澳大利亚晚 1 天时,我需要看到实际上有一天的差异。该线程中提到的其他答案显示为零或低于 1 的一些双数,我不需要。
              • 当目的是检查日期是否已经过到第二天时,这是最好的答案,无论就时间而言是否不是完整的 24 小时。
              【解决方案12】:

              假设StartDateEndDate 的类型为DateTime

              (EndDate - StartDate).TotalDays
              

              【讨论】:

              • 这个答案显然是正确的,但如果您对总天数感兴趣,您也可以使用(a - b).Days 作为int,而不是double,用十进制表示部分天差.
              • 这将减少 1 天,08/31/2013-08/01/2013=31 但这仅返回 30。
              • @JasRajBishnoi - 你可能想检查你的数学。 31 - 1 是多少?
              • JasRaj 在某种意义上也是正确的,包括两个日期,它返回的差异会减少一天。这完全取决于视角。
              • @FahadAbidJanjua 这不是问题或观点,而是时间问题,我的意思是,日期的时间部分。 08/31/2013 - 08/01/2013 真的意味着 08/31/2013 00:00:00 - 08/01/2013 00:00:00 这解释了为什么它是 30 天,因为 08/31/2013 是刚刚开始。这也解释了为什么在查询 DateTime 属性/字段时,获取范围的正确条件是 "DateTimeProperty >= FromDate && DateTimeProperty ToDate.AddDays(1) "
              【解决方案13】:

              如果有人想要一整天作为双精度数(ab 类型为 DateTime):

               (a.Date - b.Date).TotalDays
              

              【讨论】:

              • 这将始终是一个整数(即 n.00000),因为日期部分始终是午夜。
              【解决方案14】:
              protected void Calendar1_SelectionChanged(object sender, EventArgs e)
              {
                  DateTime d = Calendar1.SelectedDate;
                  // int a;
                  TextBox2.Text = d.ToShortDateString();
                  string s = Convert.ToDateTime(TextBox2.Text).ToShortDateString();
                  string s1 =  Convert.ToDateTime(Label7.Text).ToShortDateString();
                  DateTime dt = Convert.ToDateTime(s).Date;
                  DateTime dt1 = Convert.ToDateTime(s1).Date;
                  if (dt <= dt1)
                  {
                      Response.Write("<script>alert(' Not a valid Date to extend warranty')</script>");
                  }
                  else
                  {
                      string diff = dt.Subtract(dt1).ToString();
                      Response.Write(diff);
                      Label18.Text = diff;
                      Session["diff"] = Label18.Text;
                  }
              }   
              

              【讨论】:

              • 这段代码在很多方面都是错误的! 1)很多与问题无关的Winforms代码。 2)使用有线方式显示消息框(我猜是WebBrowser控件)。 3) 使用 WebBrowser 控件显示已在标签中显示的文本。 4) 如果您执行“MyDateA - MyDateB”,则使用 OperatorOverload Subtract()(默认为“-”操作)。 5)这堆代码没有解释。
              【解决方案15】:
              DateTime xmas = new DateTime(2009, 12, 25);
              double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;
              

              【讨论】:

              • 无论如何要以 DateTime 格式获取中间的天数?因为我需要每个日期来修改表格中的某个字段:) 编辑:得到它并将其发布为下面的答案。谢谢
              • DateTime xmas = new DateTime(DateTime.Today.Year, 12, 25);将使其逐年工作,而不仅仅是 2009 年 :)
              • Subtract() 是 DateTimes 的 OperatorOverload,所以它是相同的“(xmas - DateTime.Today).TotalDays - 只是更长。
              【解决方案16】:

              我认为这会做你想要的:

              DateTime d1 = DateTime.Now;
              DateTime d2 = DateTime.Now.AddDays(-1);
              
              TimeSpan t = d1 - d2;
              double NrOfDays = t.TotalDays;
              

              【讨论】:

                【解决方案17】:

                使用 TimeSpan 对象,它是日期减法的结果:

                DateTime d1;
                DateTime d2;
                return (d1 - d2).TotalDays;
                

                【讨论】:

                • 赞成只是因为它清楚地表明 (d1 - d2) 将返回一个 TimeSpan 对象。
                猜你喜欢
                • 2023-01-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多