phpな休日 BBS sitemap
1. 祝日リスト

祝日を赤くしないとカレンダーにならないので、まず祝日の確認。
来年度(2007年)から施行される「国民の祝日に関する法律の一部改正」により祝日に変更があります。

祝日 名称 振替休日有り
1月1日 元日 日曜なら翌日の月曜
1月第2月曜 成人の日  
2月11日 建国記念の日 日曜なら翌日の月曜
官報による 春分の日 日曜なら翌日の月曜
4月29日 昭和の日 日曜なら翌日の月曜
5月3日 憲法記念日 3日、4日、5日のいずれかが日曜なら5月6日
5月4日 みどりの日 3日、4日、5日のいずれかが日曜なら5月6日
5月5日 こどもの日 3日、4日、5日のいずれかが日曜なら5月6日
7月第3月曜 海の日  
2016年~8月11日 山の日 日曜なら翌日の月曜
9月第3月曜 敬老の日  
敬老の日と秋分の日に挟まれた平日 (国民の)休日  
官報による 秋分の日 日曜なら翌日の月曜
10月第2月曜 体育の日  
11月3日 文化の日 日曜なら翌日の月曜
11月23日 勤労感謝の日 日曜なら翌日の月曜
12月23日 天皇誕生日 日曜なら翌日の月曜

2. 元日と振替休日

元日・建国記念の日・昭和の日・憲法記念日・みどりの日・こどもの日・山の日・文化の日・勤労感謝の日・天皇誕生日と、日付が変動しない祝日は簡単です。ただし、日曜と重なった場合は次の月曜日が振替休日となります。(5月の3連祝日の場合は5月6日)

if (($gatsu == 1) && ($hi == 1)) { //元日(1月1日なら)
print "<td align='center' bgcolor='#ffc0cb'>" . $hi . "</td>¥n"; //背景を pink に
}
elseif (($gatsu == 1) && ($hi == 2) && ($you == 1)) { //元日の振替休日(1月2日が月曜なら)
print "<td align='center' bgcolor='#ffc0cb'>" . $hi . "</td>¥n"; //背景を pink に
}

今年(2006年)の1月1日が日曜日だったので、表示してみます。

実行 (元日処理済みの 2006年1月を表示)
3. 成人の日(○月の第○月曜日)

成人の日・海の日・敬老の日・体育の日が同じパターンです。

$monday = 0;

for文でループを始める前に $monday という変数を作って値を 0 に設定します。
ループ中月曜日($you == 1) になったら $monday の値を増やしていきます。

if ($you == 1) { //月曜日なら$mondayに+1
$monday++;
}

テーブルを書きながら1月の第2月曜に来たらセルに色をつけます。

if (($gatsu == 1) && ($monday == 2) && ($you == 1)) { //成人の日(1月の第2月曜なら)
print "<td align='center' bgcolor='#ffc0cb'>" . $hi . "</td>¥n"; //背景を pink に
}

実行 (今年の1月を表示)

2つのパターンでだいぶ処理が進みました。処理済みをつぶしていくと、残りあと3つです。

祝日 名称 振替休日有り
1月1日 元日 日曜なら翌日の月曜
1月第2月曜 成人の日  
2月11日 建国記念の日 日曜なら翌日の月曜
官報による 春分の日 日曜なら翌日の月曜
4月29日 昭和の日 日曜なら翌日の月曜
5月3日 憲法記念日 3日、4日、5日のいずれかが日曜なら5月6日
5月4日 みどりの日 3日、4日、5日のいずれかが日曜なら5月6日
5月5日 こどもの日 3日、4日、5日のいずれかが日曜なら5月6日
7月第3月曜 海の日  
(2016年~)8月11日 山の日 日曜なら翌日の月曜
9月第3月曜 敬老の日  
敬老の日と秋分の日に挟まれた平日 (国民の)休日  
官報による 秋分の日 日曜なら翌日の月曜
10月第2月曜 体育の日  
11月3日 文化の日 日曜なら翌日の月曜
11月23日 勤労感謝の日 日曜なら翌日の月曜
12月23日 天皇誕生日 日曜なら翌日の月曜

4. 春分の日・秋分の日

春分の日と秋分の日に関しては正式には閣議で決定されるものらしいので決められないところですが、先人の計算式があるので拝借しました。なんでも "1年 = 365.2421904日" であるところを365日としているためにおこるズレが0.2421904だとか、それを閏年で調整してとか、私にはとてもじゃないけど理解できませんので、興味のある方は調べてください。

春分の日は

$y2 = ($nen - 2000);

と定義したうえで

$syunbun = (int)(20.69115 + 0.2421904 * $y2 - (int)($y2/4 + $y2/100 + $y2/400));

秋分の日は

$syuubun = (int)(23.09000 + 0.2421904 * $y2 - (int)($y2/4 + $y2/100 + $y2/400));

です。

実行 (今年の3月を表示)   実行 (今年の9月を表示・国民の祝日は未処理)
5. (国民の)休日

"国民の祝日に挟まれた平日" ということで、5月4日(法律改正でみどりの日に)のために出来たと思っていたらまれに9月の敬老の日と秋分の日に挟まれることがあるようです。

9月の "(国民の)休日" は毎年該当するわけではなく、これから可能性(秋分の日が閣議によるので)があるのは2009年、2015年、2026年、2032年、2037年、2043年、2049年…(管理人はそんなに生きられません)となっています。

先に秋分の日の日付は変数 $syuubun に格納済みですので、敬老の日を表示する時に日付を変数 $keiro に格納し、$syuubun - $keiro が2ならば "国民の祝日有り" と判断して変数 $kokumin をセットします。

if (($gatsu == 9) && ($monday == 3) && ($you == 1)) { //敬老の日(9月の第3月曜なら)
$keiro = $hi; //敬老の日の日付(国民の祝日の有無確認のため)
if (($syuubun - $keiro) == 2) { //敬老の日の2日後が秋分の日なら
$kokumin = $syuubun - 1;
}
print "<td align='center' bgcolor='#ffc0cb'>" . $hi . "</td>¥n"; //背景を pink に
}

そのうえで $kokumin が有りなら

if (($kokumin) && (($gatsu == 9) && ($hi == $kokumin))) { //9月の国民の休日が有りなら
print "<td align='center' bgcolor='#ffc0cb'>" . $hi . "</td>¥n"; //背景を pink に
}

実行 (2009年の9月を表示)
6. フォームで別の年月に移動

"今月" のカレンダーしか表示できないのでは使い勝手が悪いので、フォームで年月を送信して他の年月を表示出来るようにします。
フォーム部分は

<form method="POST" action="calendar.php">
<select name="nen">
<option value="2006">2006</option>
<option value="2007">2007</option>


</select> 年 

こんな感じで良いのですが、選択した年と月を初期状態(selected)にするために

<option <?php if ($nen == "2006") { print "selected";} ?> value="2006">2006</option>

というように書きます。
フォームからPOSTされた値の受け取りは

if ($_POST["nen"]) { //"年" がPOSTされてきたら
$nen = $_POST["nen"]; //POSTの値を受け取って変数に割り当てる
$gatsu = $_POST["gatsu"]; //POSTの値を受け取って変数に割り当てる
}
else {
$nen = date("Y"); //今日の"年"
$gatsu = date("n"); //今日の"月"
}

こんなふうにして、初めてページを開いた時は今月のカレンダーを表示、フォームから年月を指定した場合はその年月のカレンダーを表示するようにします。
セルの色を変更しただけでは 「何の祝日?」 という場合もあるでしょうから title 属性を追加してマウスオーバーで表示するようにします。

if (($gatsu == 1) && ($hi == 1)) { //元日(1月1日なら)
print "<td align='center' bgcolor='#ffc0cb'><span title='元日'>" . $hi . "</span></td>¥n"; //背景を pink に
}

実行

このカレンダースクリプトも こちら からzip形式をダウンロードできるようにしました。 「いつでも手元にカレンダーを」 置いて予定を立てる時に使ったり、誕生日や大切な記念日などを追加設定するなどしてお役立てください。

2014.6.3 last edit

Produced by haku