I need to determine duration between two DateTimes in minutes.
However, there is a slight twist:
[09/30/2010 6:39:00
PM] - [09/30/2010 7:39:00 PM] = 21
Minutes
I'm just having a hard time coming up with a decent way to do it and would appreciate if anyone can suggest something.
Thanks.
Edit:
I ended up going with dtb's solution. There is only one special case which needed to be taken care of: if end time is after 7:00PM, count the minutes from 7:00AM to the actual end time.
This is how I modified it:
var minutes = from day in start.DaysInRangeUntil(end)
where !day.IsWeekendDay()
let st = Helpers.Max(day.AddHours(7), start)
let en = (day.DayOfYear == end.DayOfYear ?
end :
Helpers.Min(day.AddHours(19), end)
)
select (en - st).TotalMinutes;
Again, thanks for the help.
You can, of course, use LINQ:
DateTime a = new DateTime(2010, 10, 30, 21, 58, 29);
DateTime b = a + new TimeSpan(12, 5, 54, 24, 623);
var minutes = from day in a.DaysInRangeUntil(b)
where !day.IsWeekendDay()
let start = Max(day.AddHours( 7), a)
let end = Min(day.AddHours(19), b)
select (end - start).TotalMinutes;
var result = minutes.Sum();
// result == 6292.89
(Note: You probably need to check for a lot of corner cases which I completely ignored.)
Helper methods:
static IEnumerable<DateTime> DaysInRangeUntil(this DateTime start, DateTime end)
{
return Enumerable.Range(0, 1 + (int)(end.Date - start.Date).TotalDays)
.Select(dt => start.Date.AddDays(dt));
}
static bool IsWeekendDay(this DateTime dt)
{
return dt.DayOfWeek == DayOfWeek.Saturday
|| dt.DayOfWeek == DayOfWeek.Sunday;
}
static DateTime Max(DateTime a, DateTime b)
{
return new DateTime(Math.Max(a.Ticks, b.Ticks));
}
static DateTime Min(DateTime a, DateTime b)
{
return new DateTime(Math.Min(a.Ticks, b.Ticks));
}