ToDateTimeメソッドを使うことにより、ISO週暦でのyear年・第week週・dayOfWeek曜日に対応する日付をDateTimeで取得することができます。
このメソッドでは曜日番号(week number)ではなく曜日(DayOfWeek列挙体)を引数にとるため、曜日番号から日付を求める場合は事前にDayOfWeekに変換する必要があります。
指定された値に該当する日付がDateTimeの最小値・最大値を超える場合や、週番号・曜日が範囲外の場合は、例外ArgumentOutOfRangeExceptionがスローされます。
ISOWeek.ToDateTimeメソッドでISO週暦でのy年第w週第d日に対応する日付を取得する
using System;
using System.Globalization;
class Sample {
static void Main()
{
var isoWeekDates = new[] {
new {year = 2020, weekNumber = 1, weekdayNumber = 1}, // 2020年・最初週・最初曜日
new {year = 2020, weekNumber = 42, weekdayNumber = 5}, // 2020年・第42週・第5日
new {year = 2020, weekNumber = ISOWeek.GetWeeksInYear(2020), weekdayNumber = 7}, // 2020年・最終週・最終曜日
new {year = 2021, weekNumber = 1, weekdayNumber = 1}, // 2021年・最初週・最初曜日
new {year = 2021, weekNumber = ISOWeek.GetWeeksInYear(2021), weekdayNumber = 7}, // 2021年・最終週・最終曜日
};
var ja = new CultureInfo("ja"); // 日本語のカルチャ
foreach (var d in isoWeekDates) {
var dayOfWeek = GetDayOfWeekFromISOWeekdayNumber(d.weekdayNumber); // ISO曜日番号からDayOfWeek(曜日)に変換
Console.Write(
"ISO週暦 {0}年 第{1}週 第{2}日 ({3}) = ",
d.year,
d.weekNumber,
d.weekdayNumber,
ja.DateTimeFormat.DayNames[(int)dayOfWeek] // 曜日名(ja/日本語)を取得
);
// ISO週暦での日付(週年・週番号・曜日)をDateTimeに変換して表示する
var dt = ISOWeek.ToDateTime(d.year, d.weekNumber, dayOfWeek);
Console.WriteLine(dt.ToString("D", ja)); // DateTimeを日付のみ・長い形式(ja/日本語)で文字列化
}
}
static DayOfWeek GetDayOfWeekFromISOWeekdayNumber(int weekdayNumber)
=> weekdayNumber == 7 ? DayOfWeek.Sunday : (DayOfWeek)weekdayNumber; // 引数チェックは省略
}
実行結果
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)を参照してください。