🐘

PHPでY年M月の第n週のm曜日が何日か求める

2022/05/18に公開

ググってもなかなか見つからなくて困って結局自分で作りました。せっかく苦労して書いたので残しておきたくなりました。
多分もっと効率のいい方法があると思います。もっと良い方法があれば知りたい。

/**
 * 指定した年月のn週目の第m曜日の日付を求め、
 * その日付で作成したDateTimeインスタンスを返す
 *
 * @param int $year 		target year
 * @param int $month target 	target month
 * @param int $numberOfWeek 	target numberOfWeek
 * @param int $dayOfWeek 	target dayOfWeek
 * @return false|DateTime
 **/
function calcDateByDayOfWeek(
    int $year,
    int $month,
    int $numberOfWeek,
    int $dayOfWeek
) {
    $nw = $numberOfWeek - 1; 
    $dateTime = new DateTime("{$year}-{$month}-01 00:00:00 +{$nw} week");
    for ($i = 1; $i < 7; $i++) { 
        if ($dateTime->format('w') == $dayOfWeek) {
            return $dateTime; // 該当日付あり
        }
        $dateTime->modify("+1 day");
    }

    return false; // 該当なし
}

使用例

/* 2022年5月の第1週、金曜日の日付を求める */
$dayOfWeekMap = [
	 0 => '日',
	 1 => '月',
	 2 => '火',
	 3 => '水',
	 4 => '木',
	 5 => '金',
	 6 => '土'
];
$dateTime = calcDateByDayOfWeek(2022, 5, 1, 5);
$w = $dayOfWeekMap[$dateTime->format('w')];
echo $dateTime->format("Y年m月d日({$w})");

/* 結果:
 * 2022年05月06日(金) 
 */

2023/09/17 追記

ChatGPTに"もっと良い方法"を実践してもらいました。
あちらの方がコード行数は多いですが読みやすいかもしれないです。
https://zenn.dev/kasamifutoshi/articles/776883e8d2694e

Discussion