😀

1948年以降の祝日等を計算するJavaScriptコード

2020/10/27に公開

はじめに

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