Payam Khaninejad
Payam Khaninejad

Reputation: 7996

Find Count of Timespan overlap in Daterange

Let's say we have a Date range like: 2019-05-26 07:12:00 to 2019-11-26 19:15:00

And we got Two timespans: 07:00 and 08:00 for calculation of breakfast.

Now I had to calculate how many time this time overlap occurred.

this is what I wrote so far but I know I miss some times in start & end of periods:

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

Any help will be appreciated.

Upvotes: 0

Views: 127

Answers (1)

akg179
akg179

Reputation: 1559

Now, you say that you have a date range. StartDate and EndDate. Let's say they have values as follows:

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"

Now when you write:

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

each time this loop runs, you will get date.TimeOfDay as 07:12 for each iteration. This means that if the time component of StartDate does not fall between 07:00 and 08:00 range, then it is not going to fall for any other day in the loop as well.

Therefore, we can simplify the whole counting process in the following way:

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

Upvotes: 1

Related Questions