秋分の日
秋分の日を計算するサンプル・プログラム
秋分の日の定義は「太陽が秋分点を通過する日」であるから、天文計算に少し詳しい方なら簡単に算出できる。
ここでは、「新こよみの便利帳」(恒星社厚生閣刊)の計算式をJavaScriptで実装したプログラムを紹介する。1980年(昭和55年)から2099年までの毎年の秋分の日を表示するプログラムである。
しかし、現実の秋分の日はこの計算通りには行かない。
「国民の祝日に関する法律」第二条によると、秋分の日は「秋分日」に当たるとされる。では、「秋分日」とは何月何日なのか。
「秋分日」は、国立天文台が作成する「暦象年表」という小冊子に基いて閣議で決定され、これが官報によって周知される慣習になっている(法的に決まっているわけではない)。官報に載る時期は2月初頭で、ここに翌年の秋分の日が記載される慣習である(これも法律、政令等で決められているわけではない)。春分の日についても、同じ号の官報で公表される。また、閣議決定された国民の祝日は、内閣府のページにCSVファイルとして公開されている。
したがって、前年の1月以前に春分の日、秋分の日を特定することはできないのだ。前述のプログラムはあくまで目安であって、この通りに秋分の日が決まる保証はない。
ここでは、「新こよみの便利帳」(恒星社厚生閣刊)の計算式をJavaScriptで実装したプログラムを紹介する。1980年(昭和55年)から2099年までの毎年の秋分の日を表示するプログラムである。
しかし、現実の秋分の日はこの計算通りには行かない。
「国民の祝日に関する法律」第二条によると、秋分の日は「秋分日」に当たるとされる。では、「秋分日」とは何月何日なのか。
「秋分日」は、国立天文台が作成する「暦象年表」という小冊子に基いて閣議で決定され、これが官報によって周知される慣習になっている(法的に決まっているわけではない)。官報に載る時期は2月初頭で、ここに翌年の秋分の日が記載される慣習である(これも法律、政令等で決められているわけではない)。春分の日についても、同じ号の官報で公表される。また、閣議決定された国民の祝日は、内閣府のページにCSVファイルとして公開されている。
したがって、前年の1月以前に春分の日、秋分の日を特定することはできないのだ。前述のプログラムはあくまで目安であって、この通りに秋分の日が決まる保証はない。
敬老の日
先ほどの国民の祝日に関する法律は2001年(平成13年)6月22日に改正され(いわゆる「ハッピーマンデー法」)、敬老の日が9月15日から9月の第3月曜日に変更された。
これをプログラムで求めることは、さほど難しいことではない。国民の祝日に関する法律は、さらに2005年(平成17年)5月22日に改正され、「国民の祝日」に挟まれる日は「国民の休日」となった(第三条三項)。
これをプログラムで求めることは、さほど難しいことではない。国民の祝日に関する法律は、さらに2005年(平成17年)5月22日に改正され、「国民の祝日」に挟まれる日は「国民の休日」となった(第三条三項)。
一方で、敬老の日が20日で秋分の日が22日、または敬老の日が21日で秋分の日が23日というケースが発生する可能性がある。この場合、敬老の日の前日の日曜日と合わせて4連休、土曜日が休みならば5連休となる。第二のゴールデンウィークが出現するのだ。
このケースが最初に発生するのは2009年(平成21年)である。敬老の日が21日で秋分の日が23日のケースで、22日が「国民の休日」になる。しかし、前述したように、この通りに秋分の日が設定されるかどうかは、その前年の2月になるまで分からない。たとえば2020年(令和2年)には、敬老の日が21日で秋分の日が22日になるが、秋分の日を23日にずらして4連休にすることもできる。
このケースが最初に発生するのは2009年(平成21年)である。敬老の日が21日で秋分の日が23日のケースで、22日が「国民の休日」になる。しかし、前述したように、この通りに秋分の日が設定されるかどうかは、その前年の2月になるまで分からない。たとえば2020年(令和2年)には、敬老の日が21日で秋分の日が22日になるが、秋分の日を23日にずらして4連休にすることもできる。
祝日をコンピュータで扱うにはどうしたらいいか
秋分の日1つをとっても、コンピュータで扱うのが難しいことが理解していただけたかと思う。
移動祝日としては、このほかに、成人の日、建国記念日、春分の日、海の日、体育の日がある。中でも一番厄介なのは建国記念日である。これは政令で定められることになっているので、今年(2004年)は2月11日であったが、来年以降どう変わるか予測できない。
それでも祝日を表示させる必要に迫られることがあるだろう。
そうなったら、祝日はプログラムで算定できないものと割り切って、毎年の祝日テーブルを持たせるのが最善策である。
欧米は移動祝日が多いので、海外のカレンダープログラムは祝日テーブルを持っているものが多い。たとえばMicrosoft Outlookのスケジュール帳がそうである。
日本ではハッピーマンデー法により祝日が移動したので、変更後のテーブルがMicrosoftのサイトからダウンロードできるようになっている(OUTLOOK.HOL をダウンロードする)。
Webアプリであれば、サーバサイドに祝日テーブルを持たせればよいだろう。サーバのテーブルを変更するだけで移動祝日に対応できるからである。
移動祝日としては、このほかに、成人の日、建国記念日、春分の日、海の日、体育の日がある。中でも一番厄介なのは建国記念日である。これは政令で定められることになっているので、今年(2004年)は2月11日であったが、来年以降どう変わるか予測できない。
それでも祝日を表示させる必要に迫られることがあるだろう。
そうなったら、祝日はプログラムで算定できないものと割り切って、毎年の祝日テーブルを持たせるのが最善策である。
欧米は移動祝日が多いので、海外のカレンダープログラムは祝日テーブルを持っているものが多い。たとえばMicrosoft Outlookのスケジュール帳がそうである。
日本ではハッピーマンデー法により祝日が移動したので、変更後のテーブルがMicrosoftのサイトからダウンロードできるようになっている(OUTLOOK.HOL をダウンロードする)。
Webアプリであれば、サーバサイドに祝日テーブルを持たせればよいだろう。サーバのテーブルを変更するだけで移動祝日に対応できるからである。
Outlookの祝日テーブルから祝日を求めるプログラム
最後に、Microsoft Outlookの祝日テーブル "OUTLOOK.HOL" から祝日を抽出して表示するPHPプログラムを紹介する。
サンプル・プログラムの解説
8: //===============================================================================
9: //Outlookの祝日テーブルを参照して、曜日と祝日を表示する
10: //@param $_POST["year"] 西暦年
11: //@param $_POST["month"] 月
12: //@param $_POST["day"] 日
13: //@author パパぱふぅ,2004/09/22,(c)studio pahoo
14: //
15:
16: //Outlookの祝日テーブル
17: $FileHoliday = "C:/Program Files/Microsoft Office/OFFICE11/1041/OUTLOOK.HOL";
18:
19: //日本の祝日テーブルを識別するための冒頭行文字列
20: $Japan = mb_convert_encoding("日本", "UTF-8", "Shift_JIS");
21:
まず、変数 $FileHoliday は、お手持ちの環境に変更すること。
"OUTLOOK.HOL" 自身はUNICODEで記述されており、MacやLinuxにコピーすればそのまま利用できる。プログラムではその辺も考慮してあるが、ソース自体はShift_JISなのでご注意を。
ただし、祝日テーブルを読む処理が重いので、プログラムが単純な割には時間がかかる。
"OUTLOOK.HOL" 自身はUNICODEで記述されており、MacやLinuxにコピーすればそのまま利用できる。プログラムではその辺も考慮してあるが、ソース自体はShift_JISなのでご注意を。
ただし、祝日テーブルを読む処理が重いので、プログラムが単純な割には時間がかかる。
参考書籍
新こよみ便利帳 | |||
著者 | 暦計算研究会 | ||
出版社 | 恒星社厚生閣 | ||
サイズ | 単行本 | ||
発売日 | 1991年04月 | ||
価格 | 2,992円(税込) | ||
ISBN | 9784769907008 | ||
暦は天文学の諸分野の中でも長い歴史をもち、人間の日常社会生活に深くかかわってきた。この本はその暦を含めて実地天文学で扱う広い範囲の情報・地識を、それぞれ使いやすい数表の形にした“永久保存版”基礎データ集成である。 | |||
暦を知る事典 | |||
著者 | 岡田芳朗 | ||
出版社 | 東京堂出版 | ||
サイズ | 事・辞典 | ||
発売日 | 2006年05月 | ||
価格 | 2,750円(税込) | ||
ISBN | 9784490106862 | ||
生活の節目を少なからず暦に依拠して生きる日本人。暦に凝縮されている過去の人々の膨大な知恵や経験とは?その起源から、暦のしくみと変遷、歴史、時刻制度さらには個別の暦など、万般にわたって分りやすく解説した全く新しい暦の小百科。 | |||
参考サイト
- インターネット版官報
- PHPで祝日を求める:ぱふぅ家のホームページ
- PHPでGoogle Calendar APIを使って祝日を求める:ぱふぅ家のホームページ
- 『「国民の祝日」の由来がわかる小事典』:ぱふぅ家のホームページ
(この項おわり)
最近のプログラミング言語は、年月日から曜日を取り出す手段が用意されているので、カレンダーを作るのも随分と楽になった。
だが、祝祭日を表示するとなると、話が途端にややこしくなる。
9月は、秋分の日と敬老の日という2つの祝日がある。これらは移動祝日のため、計算で簡単に求められるものではないからだ。