ここでは、どんなシステムであれ、作成する共通モジュールのひとつ、祝日を考慮した休日判定ルーチンの作り方についてまとめています。
そもそも、土日の判定だけであればすべてのプログラム言語、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月曜日になる)という間違った結果となることがありますので注意が必要です。
ループではない方法として、例えば成人の日の場合、以下のような考え方もできます。
