Difference between two dates, ignoring weekend - working days only

Asked

Viewed 5,492 times

5

  • 2
  • Since you already have excellent answers, I’ll just leave this package who works with holidays, including.

  • @Randrade do you use? Did you see something like it takes the holidays? Does it for the future? Until when? Deals with regional holidays?

  • 1

    @bigown I no longer use because I have no need, but I’ve used and have systems using to date (with adaptations). The holidays you add in this class. Do yes for the future, with the same holidays defined. Until you want, but will always be on the same dates. It deals with regional holidays, but you need to add them in the class. If you have any more questions, call in the chat that explain better.

  • 1

    @bigown You can see an example here

  • The question is not about holidays, so it is a duplicate of a previous question.

Show 1 more comment

4 answers

5

I ended up making this code that works really well, I hope I can help other people.

   public static int GetDifDias(DateTime initialDate, DateTime finalDate)
        {
            var days = 0;
            var daysCount = 0;
            days = initialDate.Subtract(finalDate).Days;

            if (days < 0)
                days = days * -1;

            for (int i = 1; i <= days; i++)
            {
                initialDate = initialDate.AddDays(1);

                if (initialDate.DayOfWeek != DayOfWeek.Sunday &&
                    initialDate.DayOfWeek != DayOfWeek.Saturday)
                    daysCount++;
            }
            return daysCount;
        }

4

/// <summary>
/// Calculates number of business days, taking into account:
///  - weekends (Saturdays and Sundays)
///  - bank holidays in the middle of the week
/// </summary>
/// <param name="firstDay">First day in the time interval</param>
/// <param name="lastDay">Last day in the time interval</param>
/// <param name="bankHolidays">List of bank holidays excluding weekends</param>
/// <returns>Number of business days during the 'span'</returns>
public static int BusinessDaysUntil(this DateTime firstDay, DateTime lastDay, params DateTime[] bankHolidays)
{
    firstDay = firstDay.Date;
    lastDay = lastDay.Date;
    if (firstDay > lastDay)
        throw new ArgumentException("Incorrect last day " + lastDay);

    TimeSpan span = lastDay - firstDay;
    int businessDays = span.Days + 1;
    int fullWeekCount = businessDays / 7;
    // find out if there are weekends during the time exceedng the full weeks
    if (businessDays > fullWeekCount*7)
    {
        // we are here to find out if there is a 1-day or 2-days weekend
        // in the time interval remaining after subtracting the complete weeks
        int firstDayOfWeek = (int) firstDay.DayOfWeek;
        int lastDayOfWeek = (int) lastDay.DayOfWeek;
        if (lastDayOfWeek < firstDayOfWeek)
            lastDayOfWeek += 7;
        if (firstDayOfWeek <= 6)
        {
            if (lastDayOfWeek >= 7)// Both Saturday and Sunday are in the remaining time interval
                businessDays -= 2;
            else if (lastDayOfWeek >= 6)// Only Saturday is in the remaining time interval
                businessDays -= 1;
        }
        else if (firstDayOfWeek <= 7 && lastDayOfWeek >= 7)// Only Sunday is in the remaining time interval
            businessDays -= 1;
    }

    // subtract the weekends during the full weeks in the interval
    businessDays -= fullWeekCount + fullWeekCount;

    // subtract the number of bank holidays during the time interval
    foreach (DateTime bankHoliday in bankHolidays)
    {
        DateTime bh = bankHoliday.Date;
        if (firstDay <= bh && bh <= lastDay)
            --businessDays;
    }

    return businessDays;
}

I sucked that answer in the O.R.. She has the advantage that she can spend holidays. remembering that holiday is something that should be obtained from another source and may vary according to the municipality/state (not necessarily yours) and in which year is.

Behold working in the ideone. And in the .NET Fiddle. Also put on the Github for future reference.

4

One more way to join @Merson-js' lean solution with the @Maniero solution that includes holidays:

public static int CountDiasUteis(DateTime d1, DateTime d2, params DateTime[] bankHolidays)
{
    List<DateTime> datas = new List<DateTime>();

    for (DateTime i = d1.Date; i <= d2.Date; i = i.AddDays(1))
    {
        datas.Add(i);
    }

    return datas.Count(d => d.DayOfWeek != DayOfWeek.Saturday &&
                            d.DayOfWeek != DayOfWeek.Sunday &&
                            !bankHolidays.Contains(d));
}

3

Friends, just one more way to go:

public static int CountDiasUteis(DateTime d1, DateTime d2) {

   int fator = (d1 > d2 ? -1: 1);

   List<DateTime> datas = new List<DateTime>();

   for (DateTime i = d1.Date; (fator==-1 ? i >= d2.Date : i <= d2.Date); i = i.AddDays(fator)) {
      datas.Add(i);
   }

   return datas.Count(d => d.DayOfWeek != DayOfWeek.Saturday && 
                           d.DayOfWeek != DayOfWeek.Sunday) * fator;            

}
  • thought your code great but it does not return negative days ex: 06/06 to 16/06 should return -10

  • It happens that usually when we talk about the passage of time we always imagine positive numbers. Anyway I adapted the code and now it is possible to return negative values. Look at how it turned out.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.