VB.NET DateTime examples
How would you calculate which date is the fourth Thursday of a month? The fourth
Thursday must be somewhere in the fourth week of the month, so at the latest on the 4 x 7 = 28th, or earlier.
Then check if the 28th is a Thursday and if not, count back days until your reached a Thursday.
The same procedure is valid for the 2nd Monday of a month = 2 x 7 = 14th or earlier. The
algorithm has been worked out for Thanksgivingday. According to Wikipedia there
a two versions of this holiday: an American and a Canadian.
Public Shared Function thanksgivingDayUSA(year As Integer) As DateTime
'4th Thursday of November
Dim returnDate As New DateTime(year, 11, 4 * 7)
Do While returnDate.DayOfWeek <> DayOfWeek.Thursday
returnDate = returnDate.AddDays(-1)
Loop
Return returnDate
End Function
Public Shared Function thanksgivingDayCanada(year As Integer) As DateTime
'2nd Monday of October
Dim returnDate As New DateTime(year, 10, 2 * 7)
Do While returnDate.DayOfWeek <> DayOfWeek.Monday
returnDate = returnDate.AddDays(-1)
Loop
Return returnDate
End Function
DateTime example lastDayThisMonth
If you are coming from a VBA (for Excel) or VB6 environment, you are probably
familiar with DateSerial. Let's say our problem is to determine the last day of
a month, given a certain date. Using DateSerial the solution is quite simple:
Public Shared Function lastDayThisMonth(thisDate As DateTime) As DateTime
Return DateSerial(thisDate.Year, thisDate.Month + 1, 0)
End Function
In this function we are cheating a little bit. Our starting
point is thisDate as the actual input date. Then we go to the next month (adding
+1 to the actual month) and then inserting '0' as a day. This '0' is the day before day 1 of the
month, being the last day of the month before the next month, in fact being the
last day of this month. DateSerial is used in VB6 and Excel VBA and can
still be used in Visual Studio. DateSerial accepts days like '0' and months like
'13' or higher. DateTime on the other hand is more strict and does not accept
invalid arguments. So the following function, although Visual Studio does not
give any warning, will not work:
Public Shared Function lastDayThisMonth(thisDate As DateTime) As DateTime
Dim returnDate As New DateTime(thisDate.Year, thisDate.Month + 1, 0)
return returnDate
End Function
The solution to this problem is as follows: calculate the first day of this
month, then add one month and subtract one day:
Public Shared Function lastDayThisMonth(thisDate As DateTime) As DateTime
Dim
firstDay As New DateTime(thisDate.Year, thisDate.Month, 1)
Return
firstDay.AddMonths(1).AddDays(-1)
End Function
Do you agree the DateTime solution is more elegant than the DateSerial solution?