ToDateTimeメソッドを使うことにより、ISO週暦でのyear年・第week週・dayOfWeek曜日に対応する日付をDateTimeで取得することができます。
このメソッドでは曜日番号(week number)ではなく曜日(DayOfWeek列挙体)を引数にとるため、曜日番号から日付を求める場合は事前にDayOfWeekに変換する必要があります。
指定された値に該当する日付がDateTimeの最小値・最大値を超える場合や、週番号・曜日が範囲外の場合は、例外ArgumentOutOfRangeExceptionがスローされます。
ISOWeek.ToDateTimeメソッドでISO週暦でのy年第w週第d日に対応する日付を取得する
Imports System
Imports System.Globalization
Class Sample
Shared Sub Main()
Dim isoWeekDates = {
New With {.year = 2020, .weekNumber = 1, .weekdayNumber = 1}, ' 2020年・最初週・最初曜日
New With {.year = 2020, .weekNumber = 42, .weekdayNumber = 5}, ' 2020年・第42週・第5日
New With {.year = 2020, .weekNumber = ISOWeek.GetWeeksInYear(2020), .weekdayNumber = 7}, ' 2020年・最終週・最終曜日
New With {.year = 2021, .weekNumber = 1, .weekdayNumber = 1}, ' 2021年・最初週・最初曜日
New With {.year = 2021, .weekNumber = ISOWeek.GetWeeksInYear(2021), .weekdayNumber = 7} ' 2021年・最終週・最終曜日
}
Dim ja As New CultureInfo("ja") ' 日本語のカルチャ
For Each d In isoWeekDates
Dim dayOfWeek As DayOfWeek = GetDayOfWeekFromISOWeekdayNumber(d.weekdayNumber) ' ISO曜日番号からDayOfWeek(曜日)に変換
Console.Write(
"ISO週暦 {0}年 第{1}週 第{2}日 ({3}) = ",
d.year,
d.weekNumber,
d.weekdayNumber,
ja.DateTimeFormat.DayNames(CInt(dayOfWeek)) ' 曜日名(ja/日本語)を取得
)
' ISO週暦での日付(週年・週番号・曜日)をDateTimeに変換して表示する
Dim dt As DateTime = ISOWeek.ToDateTime(d.year, d.weekNumber, dayOfWeek)
Console.WriteLine(dt.ToString("D", ja)) ' DateTimeを日付のみ・長い形式(ja/日本語)で文字列化
Next
End Sub
Shared Function GetDayOfWeekFromISOWeekdayNumber(ByVal weekdayNumber As Integer) As DayOfWeek
Return If(weekdayNumber = 7, DayOfWeek.Sunday, CType(weekdayNumber, DayOfWeek)) ' 引数チェックは省略
End Function
End Class
実行結果
ISO週暦 2020年 第1週 第1日 (月曜日) = 2019年12月30日月曜日 ISO週暦 2020年 第42週 第5日 (金曜日) = 2020年10月16日金曜日 ISO週暦 2020年 第53週 第7日 (日曜日) = 2021年1月3日日曜日 ISO週暦 2021年 第1週 第1日 (月曜日) = 2021年1月4日月曜日 ISO週暦 2021年 第52週 第7日 (日曜日) = 2022年1月2日日曜日
この例で使用しているGetWeeksInYearメソッドについては§.ISO週暦での年の開始日/終了日/週数の取得 (GetYearStart/GetYearEnd/GetWeeksInYear)を参照してください。
この例で使用している、書式と書式プロバイダを指定した書式化については日時・文字列の変換と書式 §.書式とローカライズ、カルチャについてはカルチャの基本・種類・カルチャ情報の取得、日付と時刻の書式についてはカルチャと書式・テキスト処理・暦 §.日付と時間の書式 (DateTimeFormatInfo)を参照してください。