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); } int noofdays = DateTime. DaysInMonth(DateTime. Now. Year, DateTime.
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;     } } If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With