2016-06-02 1 views
1

У меня есть следующий код для расчета минут между начальной и конечной датой. Также учитывается рабочее время (от 9 до 5), чтобы он не мог рассчитать ничего за пределами рабочего времени.Проблема с вычислением прошедших минут между двумя датами

Он работает нормально, если начальная и конечная даты находятся в рабочем состоянии, но если начальная дата находится за пределами рабочего времени (до 9 часов утра), она возвращает отрицательное число.

private static int GetMinutesBetweenTwoDates(DateTime startDate, DateTime endDate) 
{ 
    var minutes = from day in startDate.DaysInRangeUntil(endDate) 
        where !day.IsWeekendDay() 
        let start = Max(day.AddHours(9), startDate) 
        let end = Min(day.AddHours(17), endDate) 
        select (end - start).TotalMinutes; 
} 

private static DateTime Max(DateTime a, DateTime b) 
{ 
    return new DateTime(Math.Max(a.Ticks, b.Ticks)); 
} 

private static DateTime Min(DateTime a, DateTime b) 
{ 
    return new DateTime(Math.Min(a.Ticks, b.Ticks)); 
} 

public 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)); 
} 

public static bool IsWeekendDay(this DateTime dt) 
{ 
    return dt.DayOfWeek == DayOfWeek.Saturday 
      || dt.DayOfWeek == DayOfWeek.Sunday; 
} 

Благодаря

+0

dont написать linq, чтобы вы могли отлаживать свой код. после поиска проблемы, тогда начните писать для него подходящий linq (если хотите). –

+0

Как насчет праздничных дней в банке? – batwad

+0

@batwad У меня есть отдельная логика, которая удаляет минуты праздничных дней в банке из общего количества прошедших минут. – Scorpion

ответ

1

Я думаю, что вам нужно фильтровать случаи с end <= start, которые могут произойти, если начало дата окончания времени после окончания рабочего времени или окончания даты до начала рабочего времени. Легче было бы добавить дополнительный пункт where:

private static int GetMinutesBetweenTwoDates(DateTime startDate, DateTime endDate) 
{ 
    var minutes = from day in startDate.DaysInRangeUntil(endDate) 
        where !day.IsWeekendDay() 
        let start = Max(day.AddHours(9), startDate) 
        let end = Min(day.AddHours(17), endDate) 
        where end > start 
        select (end - start).TotalMinutes; 
    return (int)minutes.Sum(); 
}