Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AddBusinessDays and GetBusinessDays

Tags:

c#

.net

I need to find 2 elegant complete implementations of

public static DateTime AddBusinessDays(this DateTime date, int days) {  // code here }  and   public static int GetBusinessDays(this DateTime start, DateTime end) {  // code here } 

O(1) preferable (no loops).

EDIT: By business days i mean working days (Monday, Tuesday, Wednesday, Thursday, Friday). No holidays, just weekends excluded.

I already have some ugly solutions that seem to work but i wonder if there are elegant ways to do this. Thanks


This is what i've written so far. It works in all cases and does negatives too. Still need a GetBusinessDays implementation

public static DateTime AddBusinessDays(this DateTime startDate,                                          int businessDays) {     int direction = Math.Sign(businessDays);     if(direction == 1)     {         if(startDate.DayOfWeek == DayOfWeek.Saturday)         {             startDate = startDate.AddDays(2);             businessDays = businessDays - 1;         }         else if(startDate.DayOfWeek == DayOfWeek.Sunday)         {             startDate = startDate.AddDays(1);             businessDays = businessDays - 1;         }     }     else     {         if(startDate.DayOfWeek == DayOfWeek.Saturday)         {             startDate = startDate.AddDays(-1);             businessDays = businessDays + 1;         }         else if(startDate.DayOfWeek == DayOfWeek.Sunday)         {             startDate = startDate.AddDays(-2);             businessDays = businessDays + 1;         }     }      int initialDayOfWeek = (int)startDate.DayOfWeek;      int weeksBase = Math.Abs(businessDays / 5);     int addDays = Math.Abs(businessDays % 5);      if((direction == 1 && addDays + initialDayOfWeek > 5) ||          (direction == -1 && addDays >= initialDayOfWeek))     {         addDays += 2;     }      int totalDays = (weeksBase * 7) + addDays;     return startDate.AddDays(totalDays * direction); } 
like image 392
Adrian Zanescu Avatar asked Jun 25 '09 15:06

Adrian Zanescu


People also ask

How can calculate working days in a month in C#?

int noofdays = DateTime. DaysInMonth(DateTime. Now. Year, DateTime.


1 Answers

Latest attempt for your first function:

public static DateTime AddBusinessDays(DateTime date, int days) {     if (days < 0)     {         throw new ArgumentException("days cannot be negative", "days");     }      if (days == 0) return date;      if (date.DayOfWeek == DayOfWeek.Saturday)     {         date = date.AddDays(2);         days -= 1;     }     else if (date.DayOfWeek == DayOfWeek.Sunday)     {         date = date.AddDays(1);         days -= 1;     }      date = date.AddDays(days / 5 * 7);     int extraDays = days % 5;      if ((int)date.DayOfWeek + extraDays > 5)     {         extraDays += 2;     }      return date.AddDays(extraDays);  } 

The second function, GetBusinessDays, can be implemented as follows:

public static int GetBusinessDays(DateTime start, DateTime end) {     if (start.DayOfWeek == DayOfWeek.Saturday)     {         start = start.AddDays(2);     }     else if (start.DayOfWeek == DayOfWeek.Sunday)     {         start = start.AddDays(1);     }      if (end.DayOfWeek == DayOfWeek.Saturday)     {         end = end.AddDays(-1);     }     else if (end.DayOfWeek == DayOfWeek.Sunday)     {         end = end.AddDays(-2);     }      int diff = (int)end.Subtract(start).TotalDays;      int result = diff / 7 * 5 + diff % 7;      if (end.DayOfWeek < start.DayOfWeek)     {         return result - 2;     }     else{         return result;     } } 
like image 52
Patrick McDonald Avatar answered Sep 16 '22 13:09

Patrick McDonald