「今日の曜日」「月末日の曜日」など日付から曜日を取得するのは比較的簡単ですが、逆に「〇曜日の日付が知りたい」という場合は少々手間がかかります。
例えば「定休日が水曜日の時、休みとなる水曜日の日付を全て取得する」といった時には、以下のコードが役に立つかもしれません。
コード
DateUtil.cs
public class DateUtils
{
/// <summary>
/// 対象年の指定された曜日に該当する日付を全て取得する
/// </summary>
/// <param name="targetYear">対象年</param>
/// <param name="wantDayOfWeek">対象となる曜日。この曜日に合致する日付を取得する。</param>
/// <returns>対象年における、指定した曜日の日付のリスト。</returns>
public static List<DateTime> FindWantDayOfWeek(int targetYear, DayOfWeek wantDayOfWeek)
{
// 対象年の1月1日(元旦)の曜日を取得する。
DateTime gantan = new DateTime(targetYear, 1, 1);
// 対象年の1月において、引数で指定した曜日に該当する最初の日付を取得する
DateTime date;
if (gantan.DayOfWeek == wantDayOfWeek)
{
date = gantan;
}
else
{
int additionalDay = ((int)(DayOfWeek.Saturday - gantan.DayOfWeek + wantDayOfWeek) % 7) + 1;
date = gantan.AddDays(additionalDay);
}
// 7日ずつ日付をずらして、対象年における指定した曜日の日付を全て取得する。
List<DateTime> days = new List<DateTime>();
while (date.Year == targetYear)
{
days.Add(date);
date = date.AddDays(7);
}
return days;
}
}
コードの実行
テストコード
UnitTestDateUtils.cs
[TestClass]
public class UnitTestDateUtils
{
[TestMethod]
public void TestFindWantDayOfWeek()
{
// 2019年の日曜日の日付を取得する。
var days = DateUtils.FindWantDayOfWeek(2019, DayOfWeek.Sunday);
var sunday2019 = string.Join(",", days.Select(day => day.ToString("yyyy/MM/dd")));
System.Console.WriteLine(sunday2019);
}
}
テストコードの実行結果
2019/01/06,2019/01/13,2019/01/20,2019/01/27,2019/02/03,2019/02/10,2019/02/17,2019/02/24,2019/03/03,2019/03/10,2019/03/17,2019/03/24,2019/03/31,2019/04/07,2019/04/14,2019/04/21,2019/04/28,2019/05/05,2019/05/12,2019/05/19,2019/05/26,2019/06/02,2019/06/09,2019/06/16,2019/06/23,2019/06/30,2019/07/07,2019/07/14,2019/07/21,2019/07/28,2019/08/04,2019/08/11,2019/08/18,2019/08/25,2019/09/01,2019/09/08,2019/09/15,2019/09/22,2019/09/29,2019/10/06,2019/10/13,2019/10/20,2019/10/27,2019/11/03,2019/11/10,2019/11/17,2019/11/24,2019/12/01,2019/12/08,2019/12/15,2019/12/22,2019/12/29