プログラムでもっとも正確に日本の祝日を求める方法(内閣府公表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月に更新されることと、仕様が変わる可能性があるということだけわかっていればよいと思います。
関連記事
- Windows11でオフラインアカウントを作成する方法(Microsoftアカウントを使わない)
- 「VCRUNTIME140_1.dllが見つからないため、コードの実効を続行できません」の対処法
- WindowsでソフトウエアRAIDを組む方法(ストライプボリューム ミラーボリューム RAID5)
- Connecting to walletが終わらない場合の対処法
- Google ChromeでHTTPリクエストヘッダーのAccept-Languageを変更する方法
- Windows10で自動更新を停止させる方法(Windows Updateの停止)
- PCやスマホがネットワーク内にあるかどうかを調べる(在宅かどうかの判断)
- FAT(File Allocation Table)ファイルシステムの仕様 FAT16 FAT32 exFAT VFAT
- SDカード・microSDカードの規格
- Raspberry Pi 4 Model Bのチップ・無線LANアンテナ
- Raspberry Pi Zero WHのチップ・無線LANアンテナ(大きなチップはCPUではありません)
- Raspberry Piの選び方・用途別のおすすめモデル
- Raspberry Piの各モデルスペック比較
- 各ストレージの速度一覧 規格速度や実効速度(HDD/SSD/M2/NVMe/USBメモリ)
- Poderosa5で「インデックスが配列の境界外です。」と出る場合の対処法(CentOS8 Ubuntu)
- Windowsを定時にシャットダウンするツール
- GoogleChromeでSSL接続を強制される設定(HSTS)のキャッシュを消す方法
- 10GbEのLANカードで、速度が遅いときの設定方法(ジャンボフレーム・ジャンボパケット)
- Windows10でデバイスマネージャーを開く方法
- ブラウザでJPG画像を保存しようとすると.jfifの拡張子で保存されるのを.jpgに戻す方法
- ホスト名(ドメイン)をローカルIPに名前解決させる方法(ローカルDNS不要)
- batファイルのコマンドが完了してもウインドウを開いたままにする方法
- LinuxでNTFS(Windows形式)のフォーマットをする方法
- 破損したストレージからのデータ復旧
- ata1.00: SRST failed(errno=-16) と出る場合
- Google Chromeでプロキシを使う方法(Chromeのみ・OS全体)
- Googleカレンダーの共有の予定をiPhoneに表示させる方法
- メールテキストの1行の文字数制限(最大1,000文字、78文字以下であるべき)
- MBR形式で設定されたHDDパーティションをGPT形式に変更する方法(2TB以上のHDDを認識させる方法)
- 環境変数(PATH)を設定する方法
- 多言語対応テキストエディタの一覧
- Windows8でOutlook ExpressやWindowsメール、WindowsLiveメールのデータを移行する方法
- McAfeeのアンインストールができない場合の対処法
- 「ID」や「ID_xxxx」という文字列があるCSVファイルをExcelで開くとSYLKエラーが出る
- Excelの日付が数字になるときの対処法
- Excelの日付や時間の表示形式(書式記号)の一覧
- Windows7やWindowsVistaでTelnetを使用する方法
- ユーザーフォルダのパスを取得する方法
- コマンドプロンプトの文字コードを変える方法
- コードページの一覧
- ナインパッチとは(9-Patch)
- PCでスマートフォンサイトにアクセスする方法
- Windowsでファイルの拡張子を表示する方法
- switch文とif文の違い
- 複雑なExcelファイルをプログラムで作成する方法
- Excelで保存したときのCSVファイルの仕様
- Yahoo!JAPANの提供するAPI
- 郵便番号データのダウンロードと注意点
- ハードタブとソフトタブ
スポンサーリンク