『PHP』か『JavaScript』で指定した年月の第n d曜日は何日かを取得する方法


ちょっと前の案件で、第n d曜日だけ(第2 水曜日だけとかです)
画像を変えたいという要求があったので、メモも兼ねてブログに残しておこうと思います。

最初は、PHPのソースコードから。
▼PHP版

<?php
/**
 * $year	int	求めたい日付の年を指定
 * $month	int	求めたい日付の月を指定
 * $week	int	第n週か。第1週なら1、第3週なら3を指定
 * $day		int	求めたい曜日。0〜6までの数字で指定
 */
function getWeekOfDay($year, $month, $week, $day) {
	// 1・指定した年月の最初の曜日を取得
	$firstDay = date("w", mktime(0, 0, 0, $month, 1, $year));

	// 2・求めたい曜日の第1週の日付けを計算する
	$day = $day - $firstDay + 1;
	if($day <= 0) $day += 7;

	// 3・n週まで1週間を足す
	$day += 7 * ($week - 1);

	// 4・結果を返す
	return date("Y-m-d", mktime(0, 0, 0, $month, $day, $year));
}
?>

次は、JavaScriptのソースコード。
▼JavaScript版

/**
 * year		int		求めたい日付の年を指定
 * month	int		求めたい日付の月を指定
 * week		int		第n週か。第1週なら1、第3週なら3を指定
 * day		int		求めたい曜日。0〜6までの数字で指定
 */
function getWeekOfDay(year, month, week, day) {
	// 1・指定した年月の最初の曜日を取得
	var date = new Date(year+"/"+month+"/1");
	var firstDay = date.getDay();

	// 2・求めたい曜日の第1週の日付けを計算する
	var day = day - firstDay + 1;
	if(day <= 0) day += 7;

	// 3・n週まで1週間を足す
	day += 7 * (week - 1);

	// 4・結果
	result = new Date(year+"/"+month+"/"+day);

	var Y = parseInt(result.getFullYear());
	var m = parseInt(result.getMonth())+1;
	var d = parseInt(result.getDate());

	return (Y+"-"+m+"-"+d);
}

これで、日付を取得することができます。
例えば、
getWeekOfDay(2011, 8, 2, 3)
と書けば、
2011-08-10
結果が返ってきます。

【ソースコードの説明】
PHPもJavaScriptも同じような処理をしているので、まとめて説明しちゃいますね。


1・まずは、指定された年月の初日の曜日を取得します。
PHPもJavaScriptも曜日を数値型で返すので、変数firstDayには曜日を表す数値が入ります。


2・求めたい曜日の第1週目が何日なのかを計算します。
引数dayが初日の曜日より前の曜日か後の曜日かを計算し、前の曜日なら1週間分足してしまいます。
(初日より前なら、指定した曜日は翌週にしかないから)


3・あとは、指定されたn週まで1週間を足していきます。


4・これで日付が分かったので、あとは目的にあった返し方をしてあげるだけとなります^^


PHPは探しきれなかっただけで、カレンダー関数とかで定義されているのかな~??