プログラムでもっとも正確に日本の祝日を求める方法(内閣府公表CSVの過去3度の改訂履歴)

日本の祝日は内閣府が決定し発表しています。

祝日には、元日やこどもの日などの固定の日にちや、9月の第3月曜日が敬老の日のように一定のルールで決められた日にちがあります。
振替休日や、「前日と翌日の両方を「国民の祝日」に挟まれた平日は休日」というルールもあります。

これらはプログラムにより計算で求めることができます。

しかし春分の日・秋分の日は、プログラムでおよその近似値を求めることができますが、地球の自転や公転によるものなので正確に求めることは困難です。
春分の日・秋分の日は、国立天文台が前年の2月1日に発表している「暦要項」が官報に掲載されたのち内閣府で祝日として発表されます。

つまり翌年の祝日は、2月1日までわかりません。

このようなルールで決まる祝日ですが、プログラムで計算しようとしても天皇誕生日が変更になったりするので、都度システムの管理が必要となります。

現在もっとも正確に祝日を取得するには内閣府が公開しているCSVをパースする方法です。
https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv

内閣府「国民の祝日」について

このCSVを利用すると、システムの更新なく永続的に祝日が求められる『はず』です。

実はこのCSVは何度も仕様変更がされています。

2016年2月に公開が始まっています。
この時のCSVは、下記のようなデータです。

平成28年(2016年),,平成29年(2017年),,平成30年(2018年),
名称,月日,名称,月日,名称,月日
元日,2016/1/1,元日,2017/1/1,元日,2018/1/1
成人の日,2016/1/11,成人の日,2017/1/9,成人の日,2018/1/8
建国記念の日,2016/2/11,建国記念の日,2017/2/11,建国記念の日,2018/2/11
春分の日,2016/3/20,春分の日,2017/3/20,春分の日,2018/3/21
昭和の日,2016/4/29,昭和の日,2017/4/29,昭和の日,2018/4/29
憲法記念日,2016/5/3,憲法記念日,2017/5/3,憲法記念日,2018/5/3
みどりの日,2016/5/4,みどりの日,2017/5/4,みどりの日,2018/5/4
こどもの日,2016/5/5,こどもの日,2017/5/5,こどもの日,2018/5/5
海の日,2016/7/18,海の日,2017/7/17,海の日,2018/7/16
山の日,2016/8/11,山の日,2017/8/11,山の日,2018/8/11
敬老の日,2016/9/19,敬老の日,2017/9/18,敬老の日,2018/9/17
秋分の日,2016/9/22,秋分の日,2017/9/23,秋分の日,2018/9/23
体育の日,2016/10/10,体育の日,2017/10/9,体育の日,2018/10/8
文化の日,2016/11/3,文化の日,2017/11/3,文化の日,2018/11/3
勤労感謝の日,2016/11/23,勤労感謝の日,2017/11/23,勤労感謝の日,2018/11/23
天皇誕生日,2016/12/23,天皇誕生日,2017/12/23,天皇誕生日,2018/12/23
,,,,,
月日は表示するアプリケーションによって形式が異なる場合があります。,,,,,

2017年2月22日に、この仕様がプログラムで扱いにくいとTwitterで話題となります。
この7日後の2017年3月1日になんら発表もなく仕様変更がされ、公開されたファイルが突然変更されます。
日付形式もISO8601に変更されています。
仕様変更がされたデータは下記です。
このときまだ「国民の休日」や振り替え休日はありません。

国民の祝日月日,国民の祝日名称
2017-01-01,元日
2017-01-09,成人の日
2017-02-11,建国記念の日
2017-03-20,春分の日
2017-04-29,昭和の日
2017-05-03,憲法記念日
2017-05-04,みどりの日
2017-05-05,こどもの日
2017-07-17,海の日
2017-08-11,山の日
2017-09-18,敬老の日
2017-09-23,秋分の日
2017-10-09,体育の日
2017-11-03,文化の日
2017-11-23,勤労感謝の日
2017-12-23,天皇誕生日
2018-01-01,元日
2018-01-08,成人の日
2018-02-11,建国記念の日
2018-03-21,春分の日
2018-04-29,昭和の日
2018-05-03,憲法記念日
2018-05-04,みどりの日
2018-05-05,こどもの日
2018-07-16,海の日
2018-08-11,山の日
2018-09-17,敬老の日
2018-09-23,秋分の日
2018-10-08,体育の日
2018-11-03,文化の日
2018-11-23,勤労感謝の日
2018-12-23,天皇誕生日
2019-01-01,元日
2019-01-14,成人の日
2019-02-11,建国記念の日
2019-03-21,春分の日
2019-04-29,昭和の日
2019-05-03,憲法記念日
2019-05-04,みどりの日
2019-05-05,こどもの日
2019-07-15,海の日
2019-08-11,山の日
2019-09-16,敬老の日
2019-09-23,秋分の日
2019-10-14,体育の日
2019-11-03,文化の日
2019-11-23,勤労感謝の日

さらにこのあと日付形式がハイフン区切りからスラッシュ区切りに仕様変更がされます。
ISO8601の標準国際規格からスラッシュ区切りです。
(おそらくExcelでCSV形式の保存にしたためだと思います。)

祝日名称のフォーマットも変わります。
「国民の休日」や振り替え休日が追加されます。
変更についてなにも発表がなくです。

国民の祝日・休日月日,国民の祝日・休日名称
2019/1/1,元日
2019/1/14,成人の日
2019/2/11,建国記念の日
2019/3/21,春分の日
2019/4/29,昭和の日
2019/4/30,休日
2019/5/1,休日(祝日扱い)
2019/5/2,休日
2019/5/3,憲法記念日
2019/5/4,みどりの日
2019/5/5,こどもの日
2019/5/6,休日
2019/7/15,海の日
2019/8/11,山の日
2019/8/12,休日
2019/9/16,敬老の日
2019/9/23,秋分の日
2019/10/14,体育の日(スポーツの日)
2019/10/22,休日(祝日扱い)
2019/11/3,文化の日
2019/11/4,休日
2019/11/23,勤労感謝の日
2020/1/1,元日
2020/1/13,成人の日
2020/2/11,建国記念の日
2020/2/23,天皇誕生日
2020/2/24,休日
2020/3/20,春分の日
2020/4/29,昭和の日
2020/5/3,憲法記念日
2020/5/4,みどりの日
2020/5/5,こどもの日
2020/5/6,休日
2020/7/23,海の日
2020/7/24,スポーツの日
2020/8/10,山の日
2020/9/21,敬老の日
2020/9/22,秋分の日
2020/11/3,文化の日
2020/11/23,勤労感謝の日

こののち、それまで2年分の祝日のみであったデータが1955年からのデータに変わります。
祝日名称のフォーマットが以前のものに戻ります。

国民の祝日・休日月日,国民の祝日・休日名称
1955/1/1,元日
1955/1/15,成人の日
1955/3/21,春分の日
1955/4/29,天皇誕生日
1955/5/3,憲法記念日
1955/5/5,こどもの日
1955/9/24,秋分の日
1955/11/3,文化の日
1955/11/23,勤労感謝の日
1956/1/1,元日
1956/1/15,成人の日
1956/3/21,春分の日
1956/4/29,天皇誕生日
1956/5/3,憲法記念日
1956/5/5,こどもの日
1956/9/23,秋分の日
1956/11/3,文化の日

このようにCSVデータの仕様変更はなんの発表もなく突然変わっています。

しかし、これ以降はおそらく降順が昇順に変わる程度の軽微な仕様変更ぐらいしか起こらないと思います。
・名称のルールは変わる可能性があります。
・日付形式は年によりハイフン区切り、スラッシュ区切りが変わる可能性があります。

祝日CSVが毎年2月に更新されることと、仕様が変わる可能性があるということだけわかっていればよいと思います。

関連記事

スポンサーリンク

幅と高さが明示されていない要素へのoverflow:hidden;指定が完全に反映されない

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る