查找日期范围中的时间跨度重叠计数

时间:2019-06-10 06:59:54

标签: c# .net

假设我们有一个日期范围,例如: 2019-05-26 07:12:00 2019-11-26 19:15:00

>

我们得到两个时间范围: 07:00 08:00

现在我必须计算这次重叠发生了多少次。

这是我到目前为止所写的内容,但我知道我在时段的开始和结束时会错过一些时间:

var breakfast = 0;
for (DateTime date = StartDate; date.Date <= EndDate; date = date.AddDays(1))
{

    if (date.TimeOfDay >= new TimeSpan(0, 07, 00, 00) && date.TimeOfDay <= new TimeSpan(0, 08, 00, 00))
    {
        breakfast++;
    }
}

///////
var lunch = 0;
for (DateTime date = StartDate; date.Date <= EndDate; date = date.AddDays(1))
{
    if (date.TimeOfDay >= new TimeSpan(0, 13, 00, 00) && date.TimeOfDay <= new TimeSpan(0, 14, 00, 00))
    {
        lunch++;
    }
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

现在,您说您有一个日期范围。 StartDateEndDate。假设它们的值如下:

StartDate = new DateTime(2019,05,26,07,12);    // "2019-05-26 07:12"
EndDate = new DateTime(2019,11,26,19,15);    // "2019-11-26 19:15"

现在写时:

for (DateTime date = StartDate; date.Date <= EndDate; date = date.AddDays(1))

每次循环运行一次,每次迭代您都将获得date.TimeOfDay作为07:12。这意味着,如果StartDate的时间分量不在07:00到08:00范围之间,那么它也不会在循环中的其他任何一天下降。

因此,我们可以通过以下方式简化整个计数过程:

var breakfast = 0;
if (StartDate.TimeOfDay >= new TimeSpan(0, 07, 00, 00) && StartDate.TimeOfDay <= new TimeSpan(0, 08, 00, 00))
{
    breakfast++;
    breakfast += EndDate.Date.Subtract(StartDate.Date.AddDays(1)).Days;
    if(EndDate.TimeOfDay >= new TimeSpan(0, 07, 00, 00))
        breakfast++;
}