秋分の日と敬老の日の微妙な関係

計算で簡単に求められない

秋分の日

秋分の日
カレンダー機能が必要なアプリケーションを作ったことがあるだろうか。
最近のプログラミング言語は、年月日から曜日を取り出す手段が用意されているので、カレンダーを作るのも随分と楽になった。

だが、祝祭日を表示するとなると、話が途端にややこしくなる。
9月は、秋分の日と敬老の日という2つの祝日がある。これらは移動祝日のため、計算で簡単に求められるものではないからだ。

秋分の日を計算するサンプル・プログラム

秋分の日の定義は「太陽が秋分点を通過する日」であるから、天文計算に少し詳しい方なら簡単に算出できる。
ここでは、「新こよみの便利帳」(恒星社厚生閣刊)の計算式をJavaScriptで実装したプログラムを紹介する。1980年(昭和55年)から2099年までの毎年の秋分の日を表示するプログラムである。

しかし、現実の秋分の日はこの計算通りには行かない。
国民の祝日に関する法律」第二条によると、秋分の日は「秋分日」に当たるとされる。では、「秋分日」とは何月何日なのか。
「秋分日」は、国立天文台が作成する「暦象年表」という小冊子に基いて閣議で決定され、これが官報によって周知される慣習になっている(法的に決まっているわけではない)。官報に載る時期は2月初頭で、ここに翌年の秋分の日が記載される慣習である(これも法律、政令等で決められているわけではない)。春分の日についても、同じ号の官報で公表される。また、閣議決定された国民の祝日は、内閣府のページにCSVファイルとして公開されている。
したがって、前年の1月以前に春分の日、秋分の日を特定することはできないのだ。前述のプログラムはあくまで目安であって、この通りに秋分の日が決まる保証はない。

敬老の日

敬老の日
先ほどの国民の祝日に関する法律は2001年(平成13年)6月22日に改正され(いわゆる「ハッピーマンデー法」)、敬老の日が9月15日から9月の第3月曜日に変更された。
これをプログラムで求めることは、さほど難しいことではない。国民の祝日に関する法律は、さらに2005年(平成17年)5月22日に改正され、「国民の祝日」に挟まれる日は「国民の休日」となった(第三条三項)。
一方で、敬老の日が20日で秋分の日が22日、または敬老の日が21日で秋分の日が23日というケースが発生する可能性がある。この場合、敬老の日の前日の日曜日と合わせて4連休、土曜日が休みならば5連休となる。第二のゴールデンウィークが出現するのだ。
このケースが最初に発生するのは2009年(平成21年)である。敬老の日が21日で秋分の日が23日のケースで、22日が「国民の休日」になる。しかし、前述したように、この通りに秋分の日が設定されるかどうかは、その前年の2月になるまで分からない。たとえば2020年(令和2年)には、敬老の日が21日で秋分の日が22日になるが、秋分の日を23日にずらして4連休にすることもできる。

祝日をコンピュータで扱うにはどうしたらいいか

秋分の日1つをとっても、コンピュータで扱うのが難しいことが理解していただけたかと思う。
移動祝日としては、このほかに、成人の日、建国記念日、春分の日、海の日、体育の日がある。中でも一番厄介なのは建国記念日である。これは政令で定められることになっているので、今年(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なのでご注意を。
ただし、祝日テーブルを読む処理が重いので、プログラムが単純な割には時間がかかる。

参考書籍

表紙 新こよみ便利帳
著者 暦計算研究会
出版社 恒星社厚生閣
サイズ 単行本
発売日 1991年04月
価格 2,992円(税込)
ISBN 9784769907008
暦は天文学の諸分野の中でも長い歴史をもち、人間の日常社会生活に深くかかわってきた。この本はその暦を含めて実地天文学で扱う広い範囲の情報・地識を、それぞれ使いやすい数表の形にした“永久保存版”基礎データ集成である。
 
表紙 暦を知る事典
著者 岡田芳朗
出版社 東京堂出版
サイズ 事・辞典
発売日 2006年05月
価格 2,750円(税込)
ISBN 9784490106862
生活の節目を少なからず暦に依拠して生きる日本人。暦に凝縮されている過去の人々の膨大な知恵や経験とは?その起源から、暦のしくみと変遷、歴史、時刻制度さらには個別の暦など、万般にわたって分りやすく解説した全く新しい暦の小百科。
 

参考サイト

(この項おわり)
header