祝日を赤くしないとカレンダーにならないので、まず祝日の確認。
来年度(2007年)から施行される「国民の祝日に関する法律の一部改正」により祝日に変更があります。
祝日 | 名称 | 振替休日有り |
1月1日 | 元日 | 日曜なら翌日の月曜 |
1月第2月曜 | 成人の日 | |
2月11日 | 建国記念の日 | 日曜なら翌日の月曜 |
2月23日 2020年・令和2年より | 天皇誕生日 | 日曜なら翌日の月曜 |
官報による | 春分の日 | 日曜なら翌日の月曜 |
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月曜 | 海の日 | ※ |
8月11日 2016年より | 山の日 | 日曜なら翌日の月曜 ※ |
9月第3月曜 | より敬老の日 | |
敬老の日と秋分の日に挟まれた平日 | (国民の)休日 | |
官報による | 秋分の日 | 日曜なら翌日の月曜 |
10月第2月曜 | スポーツの日(体育の日) | ※ |
11月3日 | 文化の日 | 日曜なら翌日の月曜 |
11月23日 | 勤労感謝の日 | 日曜なら翌日の月曜 |
12月23日 2018年まで | 天皇誕生日 | 日曜なら翌日の月曜 |
※天皇即位にともない、2019年に限って国民の祝日・休日が追加されます。
即位の日 5月1日が祝日になります。
それにともない、祝日に挟まれた平日、4月30日と5月2日が国民の休日。
即位礼正殿の儀 10月22日が祝日になります。
※令和2年(2020年)に限り、「海の日」は7月23日に、
「体育の日(スポーツの日)」は7月24日に、
「山の日」は8月10日になります。
※令和3年(2021年)に限り、「海の日」は7月22日に、
「スポーツの日」は7月23日に、
「山の日」は8月8日になります。8月9日(月)は振替休日になります。
元日・建国記念の日・昭和の日・憲法記念日・みどりの日・こどもの日・山の日・文化の日・勤労感謝の日・天皇誕生日と、日付が変動しない祝日は簡単です。ただし、日曜と重なった場合は次の月曜日が振替休日となります。(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日が日曜日だったので、表示してみます。
成人の日・海の日・敬老の日・体育の日が同じパターンです。
$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 に
}
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日 | 天皇誕生日 | 日曜なら翌日の月曜 |
春分の日と秋分の日に関しては正式には閣議で決定されるものらしいので決められないところですが、先人の計算式があるので拝借しました。なんでも "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));
です。
"国民の祝日に挟まれた平日" ということで、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 に
}
"今月" のカレンダーしか表示できないのでは使い勝手が悪いので、フォームで年月を送信して他の年月を表示出来るようにします。
フォーム部分は
<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形式をダウンロードできるようにしました。 「いつでも手元にカレンダーを」 置いて予定を立てる時に使ったり、誕生日や大切な記念日などを追加設定するなどしてお役立てください。
Fatal error: Uncaught Error: Undefined constant "Y.n.j" in /home/users/2/secret.jp-final/web/phpholiday/22/index.cgi:399 Stack trace: #0 /home/users/2/secret.jp-final/web/phpholiday/index.php(334): include() #1 {main} thrown in /home/users/2/secret.jp-final/web/phpholiday/22/index.cgi on line 399