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

『PHP』か『JavaScript』で指定した年月のd曜日は何日かを取得する方法を紹介したいと思います。
例えば「2011年9月の金曜日」を指定したら、戻り値で「2・9・16・23・30」が返ってくるような感じです。

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

/**
 * $year	int	求めたい年を指定
 * $month	int	求めたい月を指定
 * $day		int	求めたい曜日。0〜6までの数字で指定
 */
function getDayOfMonth($year, $month, $day) {
	// 1・指定した年月の日数を取得
	$allDays = date("t", mktime(0, 0, 0, $month, 1, $year));

	// 2・指定した年月の最初の曜日を取得
	$firstDay = date("w", mktime(0, 0, 0, $month, 1, $year));

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

	// 4・指定した年月の最終日を越えるまで1週間を足す
	while($allDays >= $day) {
		$arrDays[sizeof($arrDays)] = $day;
		$day += 7;
	}

	return $arrDays;
}

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

/**
 * year		int		求めたい日付の年を指定
 * month	int		求めたい日付の月を指定
 * day		int		求めたい曜日。0〜6までの数字で指定
 */
function getDayOfMonth(year, month, day) {
	// 1・指定した年月の日数を取得
	var date = new Date(year,month,0);
	var allDays = date.getDate();

	// 2・指定した年月の最初の曜日を取得
	date = new Date(year+"/"+month+"/1");
	var firstDay = date.getDay();

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

	// 4・指定した年月の最終日を越えるまで1週間を足す
	var arrDays = [];
	while(allDays >= day) {
		arrDays[arrDays.length] = day;
		day += 7;
	}

	return arrDays;
}

これで、指定した年月・曜日の日付を取得することができます。
getDayOfMonth(2011, 9, 1)
と書けば、配列形式で
Array([0] => 5 [1] => 12 [2] => 19 [3] => 26)
と、結果が返ってきます。

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


1・まずは、指定された年月の総日数を取得します。


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


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


4・あとは、指定された年月の最終日を超えるまで1週間を足していき、日付けを配列に追加していきます。


5・日数を格納した配列を返して終了です^^


※もっとスマートなやり方があるような気もしますが・・・

次は、指定した年月日が第n d曜日なのかを判別する方法を書こうかな~?

コメントは受け付けていません。