Reputation: 7996
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
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