C# 计算两个日期之间经过的分钟数时出现问题
我有以下代码来计算startdate和enddate之间的分钟数。它还考虑了工作时间(9到5),因此不应计算工作时间以外的任何内容 如果startdate和enddate在工作时间内为,则可以正常工作,但如果startdate在工作时间之外(上午9点之前),则返回负数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
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();
}