C# 计算两个日期之间经过的分钟数时出现问题

C# 计算两个日期之间经过的分钟数时出现问题,c#,asp.net,.net,linq,c#-4.0,C#,Asp.net,.net,Linq,C# 4.0,我有以下代码来计算startdate和enddate之间的分钟数。它还考虑了工作时间(9到5),因此不应计算工作时间以外的任何内容 如果startdate和enddate在工作时间内为,则可以正常工作,但如果startdate在工作时间之外(上午9点之前),则返回负数 private static int GetMinutesBetweenTwoDates(DateTime startDate, DateTime endDate) { var minutes = from day in

我有以下代码来计算startdate和enddate之间的分钟数。它还考虑了工作时间(9到5),因此不应计算工作时间以外的任何内容

如果startdate和enddate在工作时间内为,则可以正常工作,但如果startdate在工作时间之外(上午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;
}
private static int GetMinutesBetweenTwoDates(日期时间开始日期、日期时间结束日期)
{
var minutes=从startDate.DaysInRange中的天到(endDate)
where!day.IsWeekendDay()
让开始=最大值(天加小时(9),开始日期)
let end=Min(day.AddHours(17),endDate)
选择(结束-开始)。总分钟数;
}
私有静态日期时间最大值(日期时间a、日期时间b)
{
返回新的日期时间(Math.Max(a.Ticks,b.Ticks));
}
私有静态日期时间最小值(日期时间a、日期时间b)
{
返回新的日期时间(Math.Min(a.Ticks,b.Ticks));
}
公共静态IEnumerable DaysInRangeUntil(此日期时间开始,日期时间结束)
{
返回可枚举范围(0,1+(int)(end.Date-start.Date).TotalDays)
.Select(dt=>start.Date.AddDays(dt));
}
公共静态bool IsWeekendDay(此日期时间dt)
{
return dt.DayOfWeek==星期六
||dt.DayOfWeek==DayOfWeek.Sunday;
}

谢谢以防万一,这里有一个非常有用的时间段库:


我认为您需要使用
end-dont-write-linq筛选案例,以便调试代码。找到问题后,开始为其编写适当的linq(如果您愿意)。那么银行假日呢?@batwad我有一个单独的逻辑,可以从总已用分钟数中删除银行假日分钟数。
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();
}