Working days calculation algorithm

/// <summary>
/// 根据指定时间段计算工作日天数
/// </summary>
/// <param name="firstDay">开始天数</param>
/// <param name="lastDay">结束天数</param>
/// <param name="bankHolidays">请假日期数组</param>
/// <returns></returns>
public static int BusinessDaysUntil(DateTime firstDay, DateTime lastDay, params DateTime[] bankHolidays)
{
    firstDay = firstDay.Date;
    lastDay = lastDay.Date;
    if (firstDay > lastDay)
        throw new ArgumentException("最后一天不正确" + lastDay);

    TimeSpan span = lastDay - firstDay;
    int businessDays = span.Days + 1;
    int fullWeekCount = businessDays / 7;
    if (businessDays > fullWeekCount * 7)
    {
        int firstDayOfWeek = firstDay.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)firstDay.DayOfWeek;
        int lastDayOfWeek = lastDay.DayOfWeek == DayOfWeek.Sunday ? 7 : (int)lastDay.DayOfWeek;

        if (lastDayOfWeek < firstDayOfWeek)
            lastDayOfWeek += 7;
        if (firstDayOfWeek <= 6)
        {
            if (lastDayOfWeek >= 7)
                businessDays -= 2;
            else if (lastDayOfWeek >= 6)
                businessDays -= 1;
        }
        else if (firstDayOfWeek <= 7 && lastDayOfWeek >= 7)
            businessDays -= 1;
    }

    businessDays -= fullWeekCount + fullWeekCount;

    foreach (DateTime bankHoliday in bankHolidays)
    {
        DateTime bh = bankHoliday.Date;
        if (firstDay <= bh && bh <= lastDay)
            --businessDays;
    }

    return businessDays;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324812174&siteId=291194637