祝日を考慮した休日判定ルーチンの作り方

 ここでは、どんなシステムであれ、作成する共通モジュールのひとつ、祝日を考慮した休日判定ルーチンの作り方についてまとめています。
 そもそも、土日の判定だけであればすべてのプログラム言語、DBMSにおいて、対応する関数が用意されています。しかし祝日を判定する必要がある場合、自前で作るしかありません。
 ネット上で祝日判定のソースは無数にありますので、スクラッチで一から作るより、既存のソースを利用する方が早いのですが、正しい結果が保証されている訳ではありませんので、確認用として、以下、祝日を考慮した休日判定ルーチンをご活用下さい。


1.祝日

 以下、国民の祝日振替休日を併せて祝日です。
 ※厳密に言うと、国民の祝日も振替休日も法律上、休日という扱いなのですが、話がややこしくなるので、ここでは土日と区別した休みとして、祝日として扱います。


1-1.国民の祝日

国民の祝日に関する法律(第2条)に規定される祝日です。

祝日名 祝日区分 固定日付 曜日
元日 固定 1月1日
成人の日 変動 1月 第2週 月曜日
建国記念の日 固定 2月11日
天皇誕生日 固定 2月23日
春分の日 変動(特殊)
昭和の日 固定 4月29日
憲法記念日 固定 5月3日
みどりの日 固定 5月4日
こどもの日 固定 5月5日
海の日 変動 7月 第3週 月曜日
山の日 固定 8月11日
敬老の日 変動 9月 第3週 月曜日
秋分の日 変動(特殊)
スポーツの日 変動 10月 第2週 月曜日
文化の日 固定 11月3日
勤労感謝の日 固定 11月23日
平成の天皇誕生日 当面平日 12月23日

平成の天皇誕生日は12月23日で祝日ではなく平日

 令和元年(2019年)5月1日より、天皇誕生日が12月23日から2月23日に変更されました。
 このため、令和元年(2019年)12月23日は平日になりました。
 12月23日の今後の扱いですが、過去の例として、4月29日は昭和天皇の誕生日であり「昭和の日」祝日です。これを踏まえると、今後12月23日は「平成の日」として祝日になる可能性があります。


春分の日と秋分の日の計算式

 春分の日と秋分の日は、以下の特殊な計算式により算出します。


~春分の日・秋分の日の計算式~

 春分の日(1980~2099)
 INT(20.8431 + 0.242194 × (西暦年-1980) - INT((西暦年-1980) / 4)) 
 春分の日(2100~2150)
 INT(21.8510 + 0.242194 × (西暦年-1980) - INT((西暦年-1980) / 4)) 

 秋分の日(1980~2099)
 INT(23.2488 + 0.242194 × (西暦年-1980) - INT((西暦年-1980) / 4)) 
 秋分の日(2100~2150)
 INT(24.2488 + 0.242194 × (西暦年-1980) - INT((西暦年-1980) / 4)) 

 ※INT:整数化(小数点以下切捨て)
 ※2051年以降も延々と続くのでメンテナンスフリーの休日判定ルーチンは作れません。

 この計算式で春分の日および秋分の日を算出できるのですが、厳密には2月初日に翌年の祝日が官報で公示されるまで、未定として扱われます。
 企業システムごと、翌年以降の祝日を未定とできる場合もあれば、できない場合もあります。未定とできない場合は上記計算式で一旦確定し、もし官報の公示と相違した場合は修正するしかありません。
 しかし、現在まで、この計算式の結果と、官報の公示が相違したことはありません。

1-2.振替休日

 国民の祝日が日曜日の場合など、国民の祝日に関する法律(第3条2項、3項)に規定される。振替休日の規定です。


第3条 2.
「国民の祝日」が日曜日に当たるときは、その日後においてその日に最も近い「国民の祝日」でない日を休日とする。


第3条 3.
その前日及び翌日が「国民の祝日」である日(「国民の祝日」でない日に限る。)は、休日とする。

俗にいう、9月のシルバーウイークを形成するための法律で「国民の休日」と呼ばれます。他の月に対象はありません。
もともと9/15だった敬老の日を9月第3週月曜日に移動し、9/22か9/23となる秋分の日に挟まれる平日がある場合、休日にするというものです。


2050年までは以下の通りです。

2.祝日を考慮した休日判定ルーチンの作り方

 まずは、休日判定の元となる休日一覧を作成するところから始めます。フローは以下の通りです。

 これに企業ごとの、夏季休暇、冬季休暇、創立記念日等を加味すれば完成です。

 あとはこの休日一覧を元に、休日かどうかを判定するだけです。


変動祝日 ○月第○週の月曜日 の取得方法

・成人の日(1月第2週の月曜日)
・海の日(7月第3週の月曜日)
・敬老の日(9月 第3週 月曜日)
・スポーツの日(10月 第2週 月曜日 )
について、一番簡単に取得する方法は、単純に1日からループを回して月曜日をカウントしていけば良いだけです。

 安易に既成モジュールを使用すると、第3月曜日ではなく、実は第3週の月曜日(一週目に月曜日がない場合第2月曜日になる)という間違った結果となることがありますので注意が必要です。

 ループではない方法として、例えば成人の日の場合、以下のような考え方もできます。


おすすめの関連記事

「平成→令和」で振り返る和暦変更時のシステム対応
和暦のシステム対応について考えます。