C# 计算日期期间包含的日期数

C# 计算日期期间包含的日期数,c#,date,datetime,C#,Date,Datetime,我想计算两个日期时间之间覆盖的日期数 这不是。TotalDays,因为小于24小时的时段可能仍然会通过重叠两个不同的日期返回“2”。同样,相隔两分钟的日期仍应返回“1” 例如: 2012-2-1 14:00 to 2012-2-2 23:00 -> 2 (1st and 2nd Feb) 2012-2-1 14:00 to 2012-2-2 10:00 -> 2 (1st and 2nd Feb) 2012-2-1 23:00 to 2012-2-2 00:00 -> 2 (1

我想计算两个
日期时间
之间覆盖的日期数

这不是
。TotalDays
,因为小于24小时的时段可能仍然会通过重叠两个不同的日期返回“2”。同样,相隔两分钟的日期仍应返回“1”

例如:

2012-2-1 14:00 to 2012-2-2 23:00 -> 2 (1st and 2nd Feb)
2012-2-1 14:00 to 2012-2-2 10:00 -> 2 (1st and 2nd Feb)
2012-2-1 23:00 to 2012-2-2 00:00 -> 2 (1st and 2nd Feb)
2012-2-1 23:00 to 2012-2-3 00:00 -> 3 (1st, 2nd, 3rd Feb)
2012-2-1 14:00 to 2012-2-1 15:00 -> 1 (1st Feb)
2012-2-1 14:00 to 2012-2-1 14:00 -> 1 (1st Feb)
2012-1-1 00:00 to 2012-12-31 23:59 -> 366 (All of 2012)
我可以通过以下代码获得此功能:

DateTime dt1 = new DateTime(2000,1,2,12,00,00);
DateTime dt2 = new DateTime(2000,1,3,03,00,00);

int count = 0;
for (DateTime date = dt1; date.Date <= dt2.Date; date = date.AddDays(1))
    count++;

return count;
DateTime dt1=新的日期时间(2000,1,2,12,00,00);
DateTime dt2=新的日期时间(2000,1,3,03,00,00);
整数计数=0;
对于(DateTime date=dt1;date.date为什么不:

int count = dt1.Date.Subtract(dt2.Date).Duration().Days + 1;
使用
.Date
将日期标准化为午夜(0:00),将1添加到
以获得不同日期的数量,而不仅仅是两个日期之间的天数

使用
Duration
可以确保你总是得到一个肯定的答案。

也许简单一点

DateTime d1=DateTime.MinValue;
DateTime d2=DateTime.MaxValue;
TimeSpan span=d2-d1;
int counter = span.Days + 1;
TimeSpan duration = dt2.Date - dt1.Date;
int days = duration.Days + 1;

数学上限((d2-d1日期)。总天数)


尝试了您提到的所有案例。预期会有结果!希望有帮助。

d1.Date.Subtract(d2.Date)怎么样。TotalDays+1不确定它是如何重复的。同一天的两个日期仍应返回1。两天之间少于24小时的时间应返回两天。对于这类事情,NodeTime非常有用,请参阅:[如何使用NodaTime计算包含天数的时段][1][1]:这不是一个副本,因为它的答案与指定的副本不同……这意味着你还想计算月数。如果这样做,+1。Davio击败了你,不幸的是你被接受了。@MattMitchell:但我会使用
TimeSpan.Days
而不是
TotalDays
,因为你不想这样做o计算天数的分数(
double
),但只计算天数部分(
int
)。@MattMitchell:我看到Davio也改变了它,所以我的论点毫无意义;)是的。如果这是一个断点,我会改变被接受的答案,但功能上并不重要。谢谢你的帮助。这样就可以了。我会接受的。我没有注意到所有的测试都是以1为准。你可以使用减号而不是
。减号
来简化它(根据@Tim Schmelter的答案)@MattMitchell是的,这是一个偏好问题,当我像这样链接时,我喜欢使用减法。顺便说一句,你的
Duration()
应该是一个方法调用,而不是一个属性。它实际上处理的是我的原始样本没有处理的排序错误的日期。做得不错,但它不会处理2000/1/1 23:00到2000/1/2 00:00(返回1,应该是2,因为那里有2个日期)。请参阅@Davio的公认答案以获得有效的解决方案。@MattMitchell这表明,从数学上来说,“取
天花板
”与“取
地板
并添加
1
”不同。后者将给出正确的行为。