Search code examples
c#datedatetime

Count the number of inclusive dates covered by a date period


I'm looking to count the number of dates covered (inclusive) between two DateTimes.

This is not .TotalDays as periods less than 24 hours may still return "2" by overlapping two different days. Likewise, two dates minutes apart should still return "1".

For example:

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)

I can get this functionality with the code below:

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;

Is there a better way?


Solution

  • Why not just:

    int count = dt1.Date.Subtract(dt2.Date).Duration().Days + 1;
    

    Using .Date normalizes the Date to midnight (0:00), add 1 to the Days to get the number of different dates, not just the number of days in between.

    Using Duration makes sure you always get a positive answer.