Khrys
Khrys

Reputation: 2774

Get today -2 (skipping weekend)

How can I get the Today -2 days (the last 2 working days from now)? but skipping the weekend?

Example #1: Today is February 25, I want February 21

Example #2: Today is February 26, I want February 24

PS: Date format is DD/MM/YYYY

I have this, but the result is going forward, should I use datediff or what?:

<%
Dim d

d = DateAdd("m", 1, Now)

d = "01/" & Month(d) & "/" & Year(d)
d = DateAdd("d", -1, d)

If Weekday(d) = 7 Then
    d = DateAdd("d", -1, d)
ElseIf Weekday(d) = 1 Then
    d = DateAdd("d", -2, d)
End If

Response.Write "Day: " & d
%>

Upvotes: 2

Views: 99

Answers (2)

Bond
Bond

Reputation: 16311

This might be overkill for what you need but here are two routines I use in my scripts to add or subtract workdays while considering weekends and holidays.

Function AddWorkingDays(dtStart, intDays)

    ' Start/Default case...
    AddWorkingDays = CDate(dtStart) 

    ' If positive days, step forward, otherwise step backward...
    Dim intStep, intCount
    If intDays > 0 Then intStep = 1 Else intStep = -1

    Do While intCount <> intDays
        AddWorkingDays = AddWorkingDays + intStep
        If IsValidDate(AddWorkingDays) Then intCount = intCount + intStep
    Loop

End Function

Function IsValidDate(d)

    Dim intWeekday, intMonth, intDay
    intWeekday = Weekday(d)
    intMonth = Month(d)
    intDay = Day(d)

    ' Weekend dates are not acceptable...
    If intWeekday = vbSaturday Or intWeekday = vbSunday Then Exit Function

    ' Holidays are also not acceptable...
    If intMonth = 01 Then If intDay = 01 Then Exit Function ' New Year's Day
    If intMonth = 07 Then If intDay = 04 Then Exit Function ' Independence Day
    If intMonth = 12 Then If intDay = 25 Then Exit Function ' Christmas Day

    ' Memorial Day is the last Monday in May...
    If intWeekday = vbMonday Then If intMonth = 05 Then If intDay >= 25 Then Exit Function

    ' ... (Thanksgiving, others) ...

    ' All tests passed. Date is a valid workday...
    IsValidDate = True

End Function

Upvotes: 0

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200233

To get your desired result you need to subtract 3 days on Saturdays, 4 days on Sundays and Mondays, and 2 days on all other days. This can be achieved with something like this:

today = Now
num   = Weekday(today, vbWednesday)

d = today - (2 + num\5 + num\6)

response.write "Two working days back: " & d

The Weekday function returns a numeric value for each weekday. By basing the week on Wednesday you can calculate the additional number of days you need to subtract from the current date with integer divisions:

  • num\5 returns 1 for Saturday, Sunday and Monday, and 0 otherwise.
  • num\6 returns 1 for Sunday and Monday, and 0 otherwise.

Thus the term 2 + num\5 + num\6 becomes 3 for Saturdays, 4 for Sundays and Mondays, and 2 for all other days.

Upvotes: 3

Related Questions