Click here to Skip to main content
15,890,123 members
Articles / Web Development / ASP.NET
Article

Adding Business Days to a Date

Rate me:
Please Sign up or sign in to vote.
4.00/5 (2 votes)
29 Oct 2009Public Domain2 min read 78K   912   13   8
How to add a certain number of business days to a start date
Image 1

Introduction

Have you ever had to add days to a date and then make sure that the days are all business days?

Well, I have had to do this a number of times and when a junior developer asked me how I would do this, I thought I would share it with others. This will only work for a standard work week. By this, I mean Monday to Friday. Saturday and Sunday will be considered the weekend. The code is pretty easy to understand and if need be, should be simple to modify for your own particular use.

Using the Code

To simply add 2 business weeks to a start date, you call the function CalculateTenBusinessDaysFromInputDate and pass it the StartDate. This function will return you a date that has 10 business days from the StartDate. If the Startdate is a Saturday, we simply add 16 days to the StartDate passed in. If the StartDate is on a Sunday, then we add 15 days to the StartDate. For any other day of the week, we just add 14 days to the StartDate.

VB.NET

VB.NET
Public Function CalculateTenBusinessDaysFromInputDate(ByVal StartDate As Date) As Date
    'This simply adds at least 2 full weeks to the start date.

    Select Case StartDate.DayOfWeek

        Case DayOfWeek.Sunday
            'if the start date is not a sunday you need to add 
            '1 day to push it to a monday that is why the number is 15.
            Return StartDate.AddDays(15)
        Case DayOfWeek.Monday, DayOfWeek.Tuesday, _
		DayOfWeek.Wednesday, DayOfWeek.Thursday, DayOfWeek.Friday
            'if the start date is any other day then just add 14 days to the start date.
            Return StartDate.AddDays(14)
        Case DayOfWeek.Saturday
            'if the start date is on a Saturday you need to add 
            '2 days to push it to a monday that is why the number is 16.
            Return StartDate.AddDays(16)
        Case Else
            Return StartDate

    End Select

End Function

C#

C#
public System.DateTime CalculateTenBusinessDaysFromInputDate(System.DateTime StartDate)
{
    //This simply adds at least 2 full weeks to the start date.

    switch (StartDate.DayOfWeek)
    {
        case DayOfWeek.Sunday:
            //if the start date is not a sunday you need to add 
            //1 day to push it to a monday that is why the number is 15.
            return StartDate.AddDays(15);
            break;
        case DayOfWeek.Monday:
        case DayOfWeek.Tuesday:
        case DayOfWeek.Wednesday:
        case DayOfWeek.Thursday:
        case DayOfWeek.Friday:
            //if the start date is any other day then just add 14 days to the start date.
            return StartDate.AddDays(14);
            break;
        case DayOfWeek.Saturday:
            //if the start date is on a Saturday you need to add 
            //2 days to push it to a monday that is why the number is 16.
            return StartDate.AddDays(16);
            break;
        default:
            return StartDate;
    }
}

This bit of code is a little bit more realistic. To use the CalculateBusinessDaysFromInputDate function, you need to supply both a StartDate and the number of business days that you want added to the StartDate. In CalculateBusinessDaysFromInputDate, we first check to see if the StartDate is a Saturday or a Sunday. If so, then I knock the number of business days down by one. I do this because we don't want the resulting date to be 11 business days out. NOTE: I did not do this in the CalculateTenBusinessDaysFromInputDate. For instance if the StartDate is a Monday and we added 12 business days to it, then the result should be on a Wednesday. Before we return the resulting date, we need to make sure that the date is not a weekend. If it is, then I move the date to the next Monday. You can also move the date back to the preceeding Friday by simply using the .AddDays() Date function and pass in a negative number. i.e. .AddDays(-2).

VB.NET

VB.NET
Public Function CalculateBusinessDaysFromInputDate_
	(ByVal StartDate As Date, ByVal NumberOfBusinessDays As Integer) As Date
    'Knock the start date down one day if it is on a weekend.
    If StartDate.DayOfWeek = DayOfWeek.Saturday Or StartDate.DayOfWeek = _
	DayOfWeek.Sunday Then
        NumberOfBusinessDays -= 1
    End If
    
    For index = 1 To NumberOfBusinessDays
        Select Case StartDate.DayOfWeek
            Case DayOfWeek.Sunday
                StartDate = StartDate.AddDays(2)
            Case DayOfWeek.Monday, DayOfWeek.Tuesday, DayOfWeek.Wednesday, _
				DayOfWeek.Thursday, DayOfWeek.Friday
                StartDate = StartDate.AddDays(1)
            Case DayOfWeek.Saturday
                StartDate = StartDate.AddDays(3)
                
        End Select
        
    Next
    
    'check to see if the end date is on a weekend.
    'If so move it ahead to Monday.
    'You could also bump it back to the Friday before if you desired to. 
    'Just change the code to -2 and -1.
    If StartDate.DayOfWeek = DayOfWeek.Saturday Then
        StartDate = StartDate.AddDays(2)
    ElseIf StartDate.DayOfWeek = DayOfWeek.Sunday Then
        StartDate = StartDate.AddDays(1)
    End If
    
    Return StartDate
    
End Function

C#

C#
public System.DateTime CalculateBusinessDaysFromInputDate
	(System.DateTime StartDate, int NumberOfBusinessDays)
    {
        //Knock the start date down one day if it is on a weekend.
        if (StartDate.DayOfWeek == DayOfWeek.Saturday | 
			StartDate.DayOfWeek == DayOfWeek.Sunday)
        {
            NumberOfBusinessDays -= 1;
        }
        
        int index = 0;
        
        for (index = 1; index <= NumberOfBusinessDays; index++)
        {
            switch (StartDate.DayOfWeek)
            {
                case DayOfWeek.Sunday:
                    StartDate = StartDate.AddDays(2);
                    break;
                case DayOfWeek.Monday:
                case DayOfWeek.Tuesday:
                case DayOfWeek.Wednesday:
                case DayOfWeek.Thursday:
                case DayOfWeek.Friday:
                    StartDate = StartDate.AddDays(1);
                    break;
                case DayOfWeek.Saturday:
                    StartDate = StartDate.AddDays(3);
                    break;
            }
        }
        
        //check to see if the end date is on a weekend.
        //If so move it ahead to Monday.
        //You could also bump it back to the Friday before if you desired to. 
        //Just change the code to -2 and -1.
        if (StartDate.DayOfWeek == DayOfWeek.Saturday)
        {
            StartDate = StartDate.AddDays(2);
        }
        else if (StartDate.DayOfWeek == DayOfWeek.Sunday)
        {
            StartDate = StartDate.AddDays(1);
        }
        
        return StartDate;
    }

Points of Interest

This is a very simple way to calculate business days. There is no big algorithm associated with it.
If you need to figure out days in the past, this will work as well.  I hope this helps in some small way.

History

  • 28th October, 2009: Initial version

License

This article, along with any associated source code and files, is licensed under A Public Domain dedication


Written By
Software Developer (Senior) ITA Partners Inc,
United States United States
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionError, Need Help Pin
VasanthPorcheziyan28-Sep-14 20:27
VasanthPorcheziyan28-Sep-14 20:27 
SuggestionAdding 10 Business Days (Mo-Fr) to a Date Pin
eData-Management Solutions7-Mar-14 6:41
eData-Management Solutions7-Mar-14 6:41 
GeneralMy vote of 5 Pin
D. Waterfield20-Sep-11 7:36
D. Waterfield20-Sep-11 7:36 
SuggestionNice solution Pin
D. Waterfield20-Sep-11 7:35
D. Waterfield20-Sep-11 7:35 
GeneralRe: Nice solution Pin
Joe Doc Sr20-Sep-11 13:33
Joe Doc Sr20-Sep-11 13:33 
GeneralThis algorithm is much better: Pin
Alec Pojidaev2-Nov-09 5:27
Alec Pojidaev2-Nov-09 5:27 
QuestionGlobalization and hollydays??? Pin
Mario Majčica29-Oct-09 6:45
professionalMario Majčica29-Oct-09 6:45 
QuestionHolidays? Pin
Terence Wallace29-Oct-09 4:42
Terence Wallace29-Oct-09 4:42 
Just a thought.

"If you think it's expensive to hire a professional to do the job, wait until you hire an amateur." - Red Adair

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.