このコードでは第一週をその年の最初の月曜日から、としているため、
例えば2011年の第一週は1月3日からとなります。
2011年1月1,2日は2010年の最終週とみなされます。
''' <summary>
''' 指定した年、週番号の月曜日を取得
''' </summary>
''' <param name="year">年(yyyy)</param>
''' <param name="weekNum">週番号(1-53)</param>
''' <returns></returns>
''' <remarks></remarks>
Shared Function GetFirstDateOfWeek(ByVal year As Integer, ByVal weekNum As Integer) As DateTime
'第一週をその年最初の月曜日からの週と設定
Dim weekRule As CalendarWeekRule = CalendarWeekRule.FirstFullWeek
Dim dtJan1 As DateTime = New DateTime(year, 1, 1)
'指定した年の最初の月曜日を取得
'この例では月曜日に固定しているが、DayOfWeek.Mondayを引数として受け取れば
'任意の曜日の日付を取得できる
Dim dtFirstMonday As DateTime = GetNearestDayOfWeek(dtJan1, DayOfWeek.Monday)
Dim cal As Calendar = CultureInfo.CurrentCulture.Calendar
Dim firstWeek As Integer = cal.GetWeekOfYear(dtJan1, weekRule, DayOfWeek.Monday)
If firstWeek <= 1 Then
weekNum -= 1
End If
Dim result As DateTime = dtFirstMonday.AddDays(weekNum * 7)
Return result
End Function
''' <summary>
''' 指定した日付から直近(未来)の指定した曜日の日付を取得
''' </summary>
''' <param name="dtDate">日付</param>
''' <param name="desiredDayOfWeek">曜日</param>
''' <returns></returns>
''' <remarks></remarks>
Shared Function GetNearestDayOfWeek(ByVal dtDate As DateTime, ByVal desiredDayOfWeek As DayOfWeek) As DateTime
Dim dayOfWeek As DayOfWeek = dtDate.DayOfWeek
If dayOfWeek = desiredDayOfWeek Then
Return dtDate
Else
Return dtDate.AddDays(((Integer.Parse(System.DayOfWeek.Saturday) - Integer.Parse(dtDate.DayOfWeek) + Integer.Parse(desiredDayOfWeek)) Mod 7) + 1)
End If
End Function
使用方法はこんな感じです。
Dim year As Integer = 2011 Dim weekNum As Integer = 50 Dim dtMonday As DateTime = GetFirstDateOfWeek(weekYear, weekNum)
※「指定した日付から直近(未来)の指定した曜日の日付を取得する」メソッドに関しては、アジャイルプログラマの日常様のC# で指定した曜日の日を取得をもとに、VBに変換致しました。