Saturday, April 25, 2009

VB.Net - Get Week Number of a date

Public Function GetWeekNumber(ByVal inDate As DateTime) As Integer
Const JAN As Integer = 1
Const DEC As Integer = 12
Const LASTDAYOFDEC As Integer = 31
Const FIRSTDAYOFJAN As Integer = 1
Const THURSDAY As Integer = 4
Dim ThursdayFlag As Boolean = False

' Get the day number since the beginning of the year
Dim DayOfYear As Integer = inDate.DayOfYear

' Get the numeric weekday of the first day of the
' year (using sunday as FirstDay)
Dim StartWeekDayOfYear As Integer = _
DirectCast(New DateTime(inDate.Year, JAN, FIRSTDAYOFJAN).DayOfWeek, Integer)
Dim EndWeekDayOfYear As Integer = _
DirectCast(New DateTime(inDate.Year, DEC, LASTDAYOFDEC).DayOfWeek, Integer)

' Compensate for the fact that we are using monday
' as the first day of the week
If StartWeekDayOfYear = 0 Then
StartWeekDayOfYear = 7
End If
If EndWeekDayOfYear = 0 Then
EndWeekDayOfYear = 7
End If

' Calculate the number of days in the first and last week
Dim DaysInFirstWeek As Integer = 8 - StartWeekDayOfYear
Dim DaysInLastWeek As Integer = 8 - EndWeekDayOfYear

' If the year either starts or ends on a thursday it will have a 53rd week
If StartWeekDayOfYear = THURSDAY OrElse EndWeekDayOfYear = THURSDAY Then
ThursdayFlag = True
End If

' We begin by calculating the number of FULL weeks
' between the start of the year and
' our date. The number is rounded up, so the smallest possible value is 0.
Dim FullWeeks As Integer = _
CType(Math.Ceiling((DayOfYear - DaysInFirstWeek) / 7), Integer)

Dim WeekNumber As Integer = FullWeeks

' If the first week of the year has at least four days,
' then the actual week number for our date
' can be incremented by one.
If DaysInFirstWeek >= THURSDAY Then
WeekNumber = WeekNumber + 1
End If

' If week number is larger than week 52
' (and the year doesn't either start or end on a thursday)
' then the correct week number is 1.
If WeekNumber > 52 AndAlso Not ThursdayFlag Then
WeekNumber = 1
End If

' If week number is still 0,
' it means that we are trying to evaluate the week number for a
' week that belongs in the previous year
' (since that week has 3 days or less in our date's year).
' We therefore make a recursive call using the last day of the previous year.
If WeekNumber = 0 Then
WeekNumber = GetWeekNumber( _
New DateTime(inDate.Year - 1, DEC, LASTDAYOFDEC))
End If

Return WeekNumber
End Function

No comments:

Post a Comment