Get Date for a Day Of Week near Target Date
Private Shared Function DayOfWeek_Near_Date(DoW As DayOfWeek, Rule1 As NearestRule, dat As Date) As Date
Dim KeyDate As Date
Select Case Rule1
Case NearestRule.Before_Date : KeyDate = dat.AddDays(-7)
Case NearestRule.OnOrBefore_Date : KeyDate = dat.AddDays(-6)
Case NearestRule.NearestTo_Date : KeyDate = dat.AddDays(-3)
Case NearestRule.OnOrAfter_Date : KeyDate = dat
Case NearestRule.After_Date : KeyDate = dat.AddDays(1)
End Select
Return KeyDate.AddDays((CInt(DoW) + 7 - CInt(KeyDate.DayOfWeek)) Mod 7)
End Function
Private Enum NearestRule
Before_Date
OnOrBefore_Date
NearestTo_Date
OnOrAfter_Date
After_Date
End Enum
Get Date for a Weekday/Weekend near Target Date
Variations of this function can be useful when calculating Public Holiday Dates. E.g. In the UK,
the date of any Public Holiday that would normally fall on a Weekend is adjusted to the first
Weekday after the normal date.
Private Shared Function WeekDay_OnOrAfter_Date(dat As Date) As Date
Select Case dat.DayOfWeek
Case DayOfWeek.Saturday : dat = dat.AddDays(2)
Case DayOfWeek.Sunday : dat = dat.AddDays(1)
End Select
Return dat
End Function
Private Function WeekDay_OnOrBefore_Date(dat As Date) As Date
Select Case dat.DayOfWeek
Case DayOfWeek.Saturday : dat = dat.AddDays(-1)
Case DayOfWeek.Sunday : dat = dat.AddDays(-2)
End Select
Return dat
End Function
Private Function Weekend_OnOrAfter_Date(dat As Date) As Date
Select Case dat.DayOfWeek
Case DayOfWeek.Monday : dat = dat.AddDays(5)
Case DayOfWeek.Tuesday : dat = dat.AddDays(4)
Case DayOfWeek.Wednesday : dat = dat.AddDays(3)
Case DayOfWeek.Thursday : dat = dat.AddDays(2)
Case DayOfWeek.Friday : dat = dat.AddDays(1)
End Select
Return dat
End Function
Private Function Weekend_OnOrBefore_Date(dat As Date) As Date
Select Case dat.DayOfWeek
Case DayOfWeek.Monday : dat = dat.AddDays(-1)
Case DayOfWeek.Tuesday : dat = dat.AddDays(-2)
Case DayOfWeek.Wednesday : dat = dat.AddDays(-3)
Case DayOfWeek.Thursday : dat = dat.AddDays(-4)
Case DayOfWeek.Friday : dat = dat.AddDays(-5)
End Select
Return dat
End Function
DigitalDan.co.uk