计算两个日期之间的工作日数?
在C#中,如何计算两个日期之间的 (或工作日)天数?
回答:
我之前有过这样的任务,并且已经找到了解决方案。在这种情况下,我会避免列举所有两天之间可避免的情况。正如我在上面的答案之一中所看到的,我什至没有提到创建一堆DateTime实例。这确实是在浪费处理能力。特别是在现实世界中,当您必须检查几个月的时间间隔时。请在下面查看我的代码及其注释。
/// <summary> /// Calculates number of business days, taking into account:
/// - weekends (Saturdays and Sundays)
/// - bank holidays in the middle of the week
/// </summary>
/// <param name="firstDay">First day in the time interval</param>
/// <param name="lastDay">Last day in the time interval</param>
/// <param name="bankHolidays">List of bank holidays excluding weekends</param>
/// <returns>Number of business days during the 'span'</returns>
public static int BusinessDaysUntil(this DateTime firstDay, DateTime lastDay, params DateTime[] bankHolidays)
{
firstDay = firstDay.Date;
lastDay = lastDay.Date;
if (firstDay > lastDay)
throw new ArgumentException("Incorrect last day " + lastDay);
TimeSpan span = lastDay - firstDay;
int businessDays = span.Days + 1;
int fullWeekCount = businessDays / 7;
// find out if there are weekends during the time exceedng the full weeks
if (businessDays > fullWeekCount*7)
{
// we are here to find out if there is a 1-day or 2-days weekend
// in the time interval remaining after subtracting the complete weeks
int firstDayOfWeek = (int) firstDay.DayOfWeek;
int lastDayOfWeek = (int) lastDay.DayOfWeek;
if (lastDayOfWeek < firstDayOfWeek)
lastDayOfWeek += 7;
if (firstDayOfWeek <= 6)
{
if (lastDayOfWeek >= 7)// Both Saturday and Sunday are in the remaining time interval
businessDays -= 2;
else if (lastDayOfWeek >= 6)// Only Saturday is in the remaining time interval
businessDays -= 1;
}
else if (firstDayOfWeek <= 7 && lastDayOfWeek >= 7)// Only Sunday is in the remaining time interval
businessDays -= 1;
}
// subtract the weekends during the full weeks in the interval
businessDays -= fullWeekCount + fullWeekCount;
// subtract the number of bank holidays during the time interval
foreach (DateTime bankHoliday in bankHolidays)
{
DateTime bh = bankHoliday.Date;
if (firstDay <= bh && bh <= lastDay)
--businessDays;
}
return businessDays;
}
好答案!虽然没有什么bug。自2009年以来就没有应答者,因此我可以自由地编辑此答案。
上面的代码假定DayOfWeek.Sunday
该值7
不是这种情况。该值实际上是0
。例如firstDay
,如果lastDay
两个星期天都相同,则会导致错误的计算。1
在这种情况下,该方法返回,但应该为0
。
此错误的最简单修复:在以下代码中声明firstDayOfWeek
和的行上方的代码中替换lastDayOfWeek
以下内容:
int firstDayOfWeek = firstDay.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)firstDay.DayOfWeek;
int lastDayOfWeek = lastDay.DayOfWeek == DayOfWeek.Sunday
? 7 : (int)lastDay.DayOfWeek;
现在的结果是:
- 周五至周五-> 1
- 周六至周六-> 0
- 周日至周日-> 0
- 周五至周六-> 1
- 周五至周日-> 1
- 星期五至星期一-> 2
- 周六至周一-> 1
- 周日至周一-> 1
- 周一至周一-> 1
以上是 计算两个日期之间的工作日数? 的全部内容, 来源链接: utcz.com/qa/398735.html