如何计算两个日期之间的差异(天数)?

1446
如何在C#中计算两个日期之间的天数?

8
我发现这个真的很有用。获取开始日期和结束日期之间日期列表希望它能帮助未来需要这个的人。 :) - sys_debug
日期时间类型 DateTime 和时间间隔类型 TimeSpan 的加减运算符被重载了,就像你所期望的那样。这一切都非常简单明了。-- 你遇到了什么具体问题? - BrainSlugs83
int TotalDays = (YourEndDate - YourStartDate).TotalDays - AliNajafZadeh
17个回答

2587
假设 StartDateEndDate 的类型为 DateTime
(EndDate - StartDate).TotalDays

717
这个答案显然是正确的,但如果你想要得到一个整型的总天数而不是带小数的双精度浮点型表示局部天数差异,你也可以使用(a - b).Days - PFranchise
34
这将返回少1天,08/31/2013-08/01/2013=31,但这只返回了30。 - J R B
76
@JasRajBishnoi - 你可能需要检查一下数学。31减1等于多少? - Greg Beech
37
JasRaj在某种意义上也是正确的,因为包括两个日期在内,它返回少一天的差异。这完全取决于观察角度。 - Fahad Abid Janjua
41
这不是一个观点问题,而是一个时间问题,我是指日期中的时间部分。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)"。 - Miguel Veloso
显示剩余9条评论

381

顶部答案是正确的,但如果你只想要整天数作为整数并且可以放弃日期的时间组件,则考虑:

(EndDate.Date - StartDate.Date).Days

再次假设StartDateEndDateDateTime类型。


16
最佳答案是因为“数字天数”通常指整天。值得注意的是,Days不止于365天(其他属性如HoursMinutesSecond都有最大值,在下一个更高属性开始之前),它与TotalDays相同但没有一天的分数,并且返回int而不是double - Tim Schmelter
1
这个代码会一直按照预期工作吗?例如,如果被比较的日期中有一个是“夏令时提前”那天,减法操作是否会产生23小时的TimeSpan,如果是,那么这个23小时的TimeSpan的.Days值是否为0?(我自己尝试了一下,但是我的结果还不确定-https://dev59.com/86Hia4cB1Zd3GeqPQj9n) - Jon Schneider
是的,这就是我需要的 - 最有价值的答案。现在,没有人想在计算天数时考虑分钟和秒钟。 - solujic
如果只过去了1.5天,那么.Days函数将仅显示1天?我该如何更改它以显示2天?我只需要始终添加+1天吗? - CDrosos
4
因为很多时候你需要计算“两个日期之间的日历天数”,而不仅仅是“24小时间隔的数量”,所以我点了个赞。例如,在时间轴上需要显示一个“X天前”的标签。在这种情况下,“周一晚上11:59”和“周二早上7:00”的差距应该是“1天(前)”…因此,.Date 部分非常有用。希望我表述清楚了。 - Alex from Jitbit
我在我的代码中遇到了一个问题,即两天之间的天数差有时会有几秒钟的差异,而四舍五入则会减少一天。这种方法解决了这个问题。 - Gianmarco Biscini

161

使用TimeSpan对象,该对象是日期相减的结果:

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

59
我认为这会实现你想要的功能:
DateTime d1 = DateTime.Now;
DateTime d2 = DateTime.Now.AddDays(-1);

TimeSpan t = d1 - d2;
double NrOfDays = t.TotalDays;

37
DateTime xmas = new DateTime(2009, 12, 25);
double daysUntilChristmas = xmas.Subtract(DateTime.Today).TotalDays;

1
有没有办法以DateTime格式获取两个日期之间的天数?因为我需要每个日期来修改表中的某个字段 :) 编辑:我已经明白了,并在下面发布了答案。谢谢 - sys_debug
4
DateTime xmas = new DateTime(DateTime.Today.Year, 12, 25); 这样写可以让代码在每年的圣诞节都能正确运行,而不仅限于2009年。 - user593806
1
Subtract() 是 DateTime 的 OperatorOverload,所以它与 "(xmas - DateTime.Today).TotalDays" 相同,只是更长。 - Marc

30
// 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

您还可以获取以秒、毫秒和滴答为单位的差异。


22

如果有人想要将整天数以 double 类型返回(abDateTime 类型):

 (a.Date - b.Date).TotalDays

4
但这将始终是一个整数(即n.00000),因为日期部分始终为午夜。 - JoeNCA

22

关于计算两个日期之间的天数,通常会有一个关于时间(小时)的争论。以下是这个问题的回答和评论。

假设StartDateEndDate都是DateTime类型:如果性能不是问题,我强烈建议通过中间转换来记录你的计算过程。例如,(EndDate - StartDate).Days很难理解,因为取整会依赖于StartDateEndDate的小时组成部分。

  • 如果你想要包括小数天数的持续时间,则如已经建议的那样使用(EndDate - StartDate).TotalDays
  • 如果你想要反映两天之间的距离,则使用(EndDate.Date - StartDate.Date).Days
  • 如果你想要反映开始日期的早上到结束日期的晚上之间的持续时间(这是在项目管理软件中通常看到的),则使用(EndDate.Date-StartDate.Date). Days + 1

11

你可以尝试这个

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

2
这实际上对我帮助最大,因为我的日期差是半天,但当美国比澳大利亚晚一天时,我需要看到实际上有一天的差异。此线程中提到的其他答案显示零或小于1的某个双倍数,而我不需要这些。 - Baz Guvenkaya
这是最好的答案,当目的是检查日期是否已经过了第二天,无论时间上是否已经满足24小时的要求。 - oneberenjena
不考虑时间戳的精确差异的最佳答案。 - Sumit Shitole

4

使用时间段可以解决问题,因为它具有许多属性:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接