public static int GetFullWorkingDaysBetween(DateTime firstDate,
DateTime lastDate, IEnumerable<DateTime> holidays)
{
if (firstDate > lastDate)
{
DateTime tempDate = firstDate;
firstDate = lastDate;
lastDate = tempDate;
}
int days = (int)(lastDate.Subtract(firstDate).Ticks / TimeSpan.TicksPerDay);
int weekReminder = days % 7;
if (weekReminder > 0)
{
switch (firstDate.DayOfWeek)
{
case DayOfWeek.Monday:
days = days - ((weekReminder > 5) ? 1 : 0);
break;
case DayOfWeek.Tuesday:
days = days - ((weekReminder > 4) ? 1 : 0) - ((weekReminder > 5) ? 1 : 0);
break;
case DayOfWeek.Wednesday:
days = days - ((weekReminder > 3) ? 1 : 0) - ((weekReminder > 4) ? 1 : 0);
break;
case DayOfWeek.Thursday:
days = days - ((weekReminder > 2) ? 1 : 0) - ((weekReminder > 3) ? 1 : 0);
break;
case DayOfWeek.Friday:
days = days - ((weekReminder > 1) ? 1 : 0) - ((weekReminder > 2) ? 1 : 0);
break;
case DayOfWeek.Saturday:
days = days - 1 - ((weekReminder > 1) ? 1 : 0);
break;
case DayOfWeek.Sunday:
days = days - 1;
break;
}
}
days = days - (2 * ((int)days / 7));
if (holidays != null && holidays.Count() > 0)
{
foreach (DateTime holiday in holidays.Where(
h => h >= firstDate && h < lastDate))
{
DayOfWeek dayOfWeekOfHoliday = holiday.DayOfWeek;
if (dayOfWeekOfHoliday != DayOfWeek.Saturday &&
dayOfWeekOfHoliday != DayOfWeek.Sunday)
{
days = days - 1;
}
}
}
return days;
}