プログラマーなら誰しも一度は祝日について頭を悩ませたことがあるでしょう(要出典)。
日付が固定ならまだ楽なんですが、「春分の日」「秋分の日」のように天体の運行によって決まる祝日があったり、 ハッピーマンデー制度によって「成人の日(一月の第二月曜日)」のような曜日固定の祝日があったり、 振替休日という概念があったりと、ちゃんと考えるとかなり面倒です。
更に面倒なのが国の施策によってたまに変更になるという点です。 東京オリンピックの延期で祝日が移動したのは記憶に新しいですね。 前年の 12 月 4 日に法律が公布されるという、カレンダーの印刷会社泣かせなスケジュール変更です。
プログラムなら更新可能ですが、ライブラリとして組み込まれているとうっかり更新を忘れてしまうこともありますよね。 そういうわけで API として提供されていると嬉しいな、プログラミング言語に縛られることもないし、ということで作りました。
使い方
パスに日付を入力して GET リクエストを投げるだけのシンプルな API です。
ある年の祝日一覧を取得する
GET /{year}
で year
の祝日一覧を返します。
以下は 2021 年の祝日一覧を返す例です。
curl https://holidays-jp.shogo82148.com/2021 | jq .
{
"holidays": [
{
"date": "2021-01-01",
"name": "元日"
},
{
"date": "2021-01-11",
"name": "成人の日"
},
{
"date": "2021-02-11",
"name": "建国記念の日"
},
(snip)
{
"date": "2021-11-23",
"name": "勤労感謝の日"
}
]
}
ある月の祝日一覧を取得する
GET /{year}/{month}
で月の祝日一覧を返します。
以下は 2021 年 1 月の祝日一覧を返す例です。
curl https://holidays-jp.shogo82148.com/2021/01 | jq .
{
"holidays": [
{
"date": "2021-01-01",
"name": "元日"
},
{
"date": "2021-01-11",
"name": "成人の日"
}
]
}
ある日が祝日か調べる
GET /{year}/{month}/{day}
でその日が祝日か調べることができます。
年・月とレスポンスの形式をあわせるために、必ず配列形式で返ってきます。
配列の件数で祝日・平日を判断してください。
祝日の例:
curl https://holidays-jp.shogo82148.com/2021/01/01 | jq .
{
"holidays": [
{
"date": "2021-01-01",
"name": "元日"
}
]
}
平日の例:
curl https://holidays-jp.shogo82148.com/2021/02/01 | jq .
{
"holidays": []
}
実装
最近マイブームな Amazon API Gateway + AWS Lambda による実装です。 AWS の設定管理には AWS Serverless Application Modelを利用しています。
データーソースには 2017 年の登場時にちょっと話題になった syukujitsu.csv を利用しています。
- 「国民の祝日」について - 内閣府
- 祝日オープンデータを巡って
- 内閣府の「国民の祝日」の CSV がひどい。
- 内閣府はもうちょっとがんばってください。→ その後、だいぶがんばってくれたようです(2017-03-03 追記)
2021-09-04 現在 syukujitsu.csv には昭和 30 年(1955 年)から令和 4 年(2022 年)までの祝日が含まれています。 この期間に関しては CSV から検索して祝日を返しています。 2023 年以降に関しては 国民の祝日に関する法律 をもとに計算して求めています。
さて、真面目に計算しているおかげで法律の改正まではうまく動く想定でいますが、 syukujitsu.csv が更新されたら改正がないかチェックしたいですね。 色々考えた結果 Amazon EventBridge のスケジュールイベント をトリガーにして、 AWS Lambda → GitHub Repository dispatch → GitHub Actions で更新チェック、という形にしました。 ちょっと複雑ですね。なんでこんな面倒な構成に?とみなさん疑問を持つと思います。
syukujitsu.csv の定期更新はすでに先人がいるのですが、彼らの更新チェッカーを参考にした上でこうしました。
- github.com/holidays-jp
- travis-ci.org の CRON 機能を使って更新
- しかし travis-ci.org のシャットダウンとともに更新停止している模様
- 一応 issue は切っておいた
- github.com/holiday-jp/holiday_jp
- GitHub Actions の Schedule Events を利用
- 毎日更新チェックが動いている
- github.com/soh335/shukujitsu
- GitHub Actions の Schedule Events を利用
- ワークフローの自動無効化機能 によって最近まで更新停止してた
- 5 日前に手動実行されてたので、少なくとも 60 日間は更新チェックが走るはず
無料で使える範囲だとサービスの都合で CRON ジョブが止められる可能性があるんですね・・・。 ただより高いものはない、ということで多少お金をかけてでもジョブが止まらないように工夫した結果が先の構成です(とは言っても 1 円/月もかからないと思ってる)。 ただし動かしたばかりなので、いつまでノーメンテで動き続けるかは要観察です。
まとめ
祝日 API を公開しました。
できたてホヤホヤですが、ぜひご利用ください。
参考
- github.com/shogo82148/holidays-jp
- 「国民の祝日」について - 内閣府
- 暦要項
- 2021 年の祝日移動について
- 東京五輪開催で夏の祝日が移動 〜各言語の祝日ライブラリの 2021 年の祝日対応を追ってみる〜
- 国民の祝日に関する法律 - e-Gov 法令検索
- 長沢 工(1999) “日の出・日の入りの計算 天体の出没時刻の求め方” 株式会社地人書館
- 日本の祝日を JSON / CSV 形式で返す API
- github.com/holidays-jp
- github.com/holiday-jp
- github.com/soh335/shukujitsu
- 祝日オープンデータを巡って
- 内閣府の「国民の祝日」の CSV がひどい。
- 内閣府はもうちょっとがんばってください。→ その後、だいぶがんばってくれたようです(2017-03-03 追記)
- Calendar::Japanese::Holiday