PHPカレンダー

晴れPHPでカレンダーを作ろうとしている。
どうやって考えればいいのかよくわからなかったので、他所から当月と指定した月日の日付と曜日を表示するPHPスクリプト(http://ponk.jp/php_time/index.php?page=4)を借りてきて、
それをアレンジ。

テーブルを使ってカレンダーっぽい表示にはなった。 日曜日には色をつけた。
過去と未来にどこまでさかのぼれるのかやってみた。
すると、過去は1902年1月が限界。 1901年12月を表示すると乱れる。
未来は2037年12月が限界。 2038年1月を表示すると乱れる。

過去は105年前も表示する必要がないからいいとして、問題は未来。
どうやらこれは「2038年問題」というらしい。
コンピュータ上で日付の計算方法が、1970年1月1日0時0分0秒からの累計秒で計算されているらしい。
32ビット符号つき整数を使ってあらわされてる場合がほとんどなので、上限値は21億4748万3647らしい。
そして1970年1月1日0時0分0秒から21億4748万3647秒後は2038年1月19日12時14分8秒(日本時間)を超えると値が負の値になって狂うらしい。
同様に負の値も-21億4748万3647までなので、1902年1月までしか表示できない。
まぁとても気の遠くなるような桁数の話だけど……

だけどこれが現実的なコンピュータの問題として浮き彫りになってる。 2000年問題の時は、直前になって騒がれていたような気がしたけれど、これはまだあと32年もある。 それまでにきちんと対処されるんだろうね、きっと。
対策として64ビット整数型で秒をあらわせばいいらしい。 そうすれば西暦3000億年までカウントできるらしい。
64ビット整数型にするのがものすごい大変なことなのかどうかはわからないけれど……

というわけで、2037年12月までしか表示できないカレンダーの完成。
あとは祝日の表示。

1月1日 元旦
1月第2月曜日 成人の日
2月11日 建国記念日
3月23日ごろ 春分の日
4月29日 みどりの日
5月3日 憲法記念日
5月4日 国民の休日
5月5日 こどもの日
7月第3月曜日 海の日
9月第3月曜日 敬老の日
9月23日ごろ 秋分の日
10月第2月曜日 体育の日
11月3日 文化の日
11月23日 勤労感謝の日
12月23日 天皇誕生日

2006年の段階での祝日はこれだけ。
2007年から4月29日が「昭和の日」となって、5月4日が「みどりの日」となるらしい。
春分の日は3月21日、秋分の日は9月23日というイメージを持っていたのだけど、これも確定された日にちではないらしい。 天文台の計測によって毎年変わるらしい。

春分の日は、2008年、2009年、2012年、2013年、2016年、2017年、2020年、2021年、2024年、2025年は3月20日らしい。 それ以外の年は3月21日。
秋分の日は、2012年、2016年、2020年、2024年、2028年、2032年、2036年、2040年、2044年は9月22日らしい。
それ以外の年は9月23日。

さらに知ったこと。
国民の祝日というものについて。
5月4日は「国民の休日」となっている。 これはこういう名前の休みの日かと思っていた。 だけど実際には定義があるらしい。
祝日Aと祝日Cに間を挟まれた祝日Bを国民の休日というらしい。
5月だと、5月3日が祝日A、5月5日が祝日C。 そして5月4日は普通の日。 だけど、国民の休日の法則にのっとると、
5月4日が国民の休日になる。 ただし、5月3日が日曜日、5月4日が日曜日の場合は国民の休日にはならないらしい。

ハッピーマンデー法で9月第3月曜となった敬老の日。
年によって日付が変わる秋分の日。
たとえば2009年。 予定では9月21日が敬老の日。 そして9月23日が秋分の日。 間に挟まれた9月22日が、国民の休日となるらしい。 5月4日以外では初めてのケースだって。 これと同じことが2015年にも起こるらしい。

そんなこんなで、カレンダーの祝日を入れるのに一苦労。
普通の祝日は入れることができたけれど、国民の休日、1992年以前の春分の日、秋分の日、振り替え休日はまだできてない。 むずかしすぎ!

サンプル
ソース