65.9K
CodeProject is changing. Read more.
Home

Excel NetworkDays for C#

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0 vote)

Oct 6, 2011

CPOL
viewsIcon

6825

public static int GetFullWorkingDaysBetween(DateTime firstDate, DateTime lastDate, IEnumerable holidays){ if (firstDate > lastDate)// Swap the dates if firstDate > lastDate { DateTime tempDate = firstDate; firstDate = lastDate; lastDate =...

public static int GetFullWorkingDaysBetween(DateTime firstDate, 
       DateTime lastDate, IEnumerable<DateTime> holidays)
{
    if (firstDate > lastDate)// Swap the dates 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);
                // Another way for this:
                //days = days - ((int)weekReminder % 5);
                // but i think its more expensive
                break;
            case DayOfWeek.Tuesday:
                days = days - ((weekReminder > 4) ? 1 : 0) - ((weekReminder > 5) ? 1 : 0);
                // The same from above
                //days = days - ((int)weekReminder % 4);
                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;
}