Created
February 14, 2017 07:10
-
-
Save timgaunt/b77e7d34c0a7f05817fa5c132bf1009a to your computer and use it in GitHub Desktop.
Calculate the number of business days between two dates
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/// <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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Originally from: http://stackoverflow.com/a/1619375/197634