AZ. - 1 year ago 55

C# Question

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 = Convert.ToInt32(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);

}

Answer Source

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;
}
}
```