c# DateTime to Add/Subtract Working Days
Based on Taz's link:
public static class DateTimeExtensions
{
public static DateTime AddWorkDays(this DateTime date, int workingDays)
{
int direction = workingDays < 0 ? -1 : 1;
DateTime newDate = date;
while (workingDays != 0)
{
newDate = newDate.AddDays(direction);
if (newDate.DayOfWeek != DayOfWeek.Saturday &&
newDate.DayOfWeek != DayOfWeek.Sunday &&
!newDate.IsHoliday())
{
workingDays -= direction;
}
}
return newDate;
}
public static bool IsHoliday(this DateTime date)
{
// You'd load/cache from a DB or file somewhere rather than hardcode
DateTime[] holidays =
new DateTime[] {
new DateTime(2010,12,27),
new DateTime(2010,12,28),
new DateTime(2011,01,03),
new DateTime(2011,01,12),
new DateTime(2011,01,13)
};
return holidays.Contains(date.Date);
}
}
I would suggest that you have to implement it by your own, and would do it inside an extension method like this:
public static class DateTimeExtensions
{
public static DateTime AddWorkdays(this DateTime originalDate, int workDays)
{
DateTime tmpDate = originalDate;
while (workDays > 0)
{
tmpDate = tmpDate.AddDays(1);
if (tmpDate.DayOfWeek < DayOfWeek.Saturday &&
tmpDate.DayOfWeek > DayOfWeek.Sunday &&
!tmpDate.IsHoliday())
workDays--;
}
return tmpDate;
}
public static bool IsHoliday(this DateTime originalDate)
{
// INSERT YOUR HOlIDAY-CODE HERE!
return false;
}
}
I did this recently with a bit of LINQ:
private DateTime CalculateFutureDate(DateTime fromDate, int numberofWorkDays, ICollection<DateTime> holidays)
{
var futureDate = fromDate;
var daterange = Enumerable.Range(1, numberofWorkDays * 2);
var dateSet = daterange.Select (d => futureDate.AddDays(d));
var dateSetElim = dateSet.Except(holidays).Except(dateSet.Where( s =>s.DayOfWeek == DayOfWeek.Sunday).Except(dateSet.Where (s=>s.DayOfWeek==DayOfWeek.Saturday) ));
//zero-based array
futureDate = dateSetElim.ElementAt(numberofWorkDays-1);
return futureDate;
}