1948年以降の祝日等を計算するJavaScriptコード
はじめに
https://github.com/boiledorange73/hdayjp.js で、1948年以降の祝日を計算するJavaScriptコードを公開しています。
ここでは、祝日計算スクリプトの解説をしたいと思います。
おことわり
これ、ずっと前に Qiita に出してたのですが、zenn にお引越しした際に全く違う文書をコピペしていました。当時の文書は残っていませんので、書き直しました。
祝日法について
国民の祝日に関する法律(昭和23年 法律第178号)は、1948年7月20日に公布、即日施行されました。
そのため、祝日法に基づく祝日は、同年の「秋分の日」からです。
祝日の変遷
これまでの祝日の変遷をまとめると次の通りです。
- 1948年 - 正月、成人の日(固定)、春分の日、天皇誕生日(昭和年間)、憲法記念日、こどもの日、秋分の日、文化の日、勤労感謝の日
- 1966年 - 建国記念の日、敬老の日(固定)、体育の日(固定) が追加
- 1973年4月12日 - 振替休日制度導入
- 1986年 - 国民の休日制度導入(当時は5/4のみ)
- 1989年 - みどりの日(4/29)、天皇誕生日(平成年間) が追加
- 1996年 - 海の日(固定) が追加
- 2000年 - 成人の日が(固定)から(第2日月曜)に変更、体育の日が(固定)から(第2月曜)に変更
- 2003年 - 海の日が(固定)から(第3月曜)に変更、敬老の日が(固定)から(第3月曜)に変更
- 2007年 - みどりの日が(4/29)から(5/4)に変更、昭和の日が追加
- 2016年 - 山の日が追加
- 2018年 - 天皇誕生日(令和年間)が追加、体育の日がスポーツの日に名称変更
だいたいのアルゴリズム
月初の曜日を知るためだけに修正ユリウス日を使う
年月日そのままでは、毎月の日数が違いますし、年によって2月の日数が違ってきます。
ところが、曜日は規則正しいです。そのため年月日から曜日を計算するには、ちょっとした計算が必要です。
ここでは修正ユリウス日(以下 "MJD")を使うことにしました。曜日を求めるのでしたら、オリジナルに何か作れそうでしたが、他の日数計算にも使いまわせそうだと思ったので、これにしました。
(MJD+3)%7 で、0と日曜が対応する曜日コードが出ます。
ただし、MJDは月をまたぐ場合の計算に強いですが、月内に限定されるなら、大して必要でもありません。ですので、月ごとの日数を計算する際は、MJDを使っていません。
MJDにしなくてもいいように思いました。
祝日と日曜の設定
一定規則に基づき、祝日と日曜を設定します。
このうち、元日(1月1日)などの固定祝日はそのまま、日曜は月初の曜日から出ます。
週・曜日指定
1月第2月曜日のように、週・曜日を指定する祝日があります。「ハッピーマンデー」等とも呼ばれます。やや面倒ですが、難しくなく計算できます。
(祝日の週番号)*7 + (7+祝日の曜日コード - 月初の曜日コード) % 7 - 6
になります。
春分の日、秋分の日
春分の日、秋分の日は、国立天文台が「暦要項」を前年2月の最初の官報に掲載しますが、これをもって正式決定となります。https://www.nao.ac.jp/faq/a0301.html 参照。
レポートを出して、前年2月に閣議決定で決まります。
1980年以降は、簡易計算式があるので使いました。http://oshiete.goo.ne.jp/qa/1454974.html 参照。
1979年までは、春分の日は 1960, 1968, 1972, 1976年が3月20日、他は3月21日になります。また、秋分の日は 1951, 1955, 1959, 1963, 1967, 1971, 1975, 1979年が9月24日、他は9月23日になります。http://www.asahi-net.or.jp/~ci5m-nmr/misc/equinox.html 参照。
振替休日
1973年4月以降に適用します。
単純に日曜日に祝日があると、次の祝日でない日を振替休日とします。
このスクリプトにおける振替休日のスキャンでは、月またぎができませんし、次の日曜日に達した場合の処理は入っていません。ただ、いずれも現時点では起こりません。
2006年以前の振替休日は厳密には、祝日が日曜なら翌日が休みとなりますが、2007年以降の計算方法でも問題ありません。
国民の休日
1986年以降に適用します。
特定の日について、前日が祝日で、翌日が祝日で、当日が日曜日でも祝日でもない場合、その日は国民の休日です。
おわりに
いかがだったでしょうか。
本記事では、祝日計算スクリプトの解説をしました。
じっくり見ていくと、そんなに難しい箇所はありませんが、場合分けを丁寧にすることが重要です。
ただし、今後も祝日が変わることがあるのと、春分の日と秋分の日は不定ですので、随時見直しが必要となる可能性があります。
本記事のライセンス
この記事は クリエイティブ・コモンズ 表示 4.0 国際 ライセンス の下に提供されています。
Discussion