東京五輪開催で夏の祝日が移動 〜各言語の祝日ライブラリの2021年の祝日対応を追ってみる〜

大遅刻をしてしまいましたが、これは[ミクシィグループ Advent Calendar 2020](https://qiita.com/advent-calendar/2020/mixi) 12日目の記事です。

以前、2018年の年末に「[#平成最後 のクリスマスに贈る、2019年の祝日対応と改元の話](https://qiita.com/takaya1992/items/0ba4ce5429dd5fd26b04)」という記事を書いたことがあります。この記事を書いたときは、祝日について考えることなんて当分ないだろうと考えていたんですが、2年後の今年、また祝日について考えなければならないようです……。

# COVID-19による東京オリンピック 2020の延期

みなさんご存知のとおり、2020年の年初から世界中で新型コロナウイルス COVID-19が猛威をふるい、2020年の夏に東京で開催予定だった 東京オリンピック2020も2021年に延期となりました。

日本では、2020年のオリンピックの開催に合わせ、法律を改正（[平成三十二年東京オリンピック競技大会・東京パラリンピック競技大会特別措置法及び平成三十一年ラグビーワールドカップ大会特別措置法の一部を改正する法律](http://www.shugiin.go.jp/internet/itdb_housei.nsf/html/housei/19620180620055.htm)）し一部の祝日を移動し開会式と閉会式前後を連休にして、通勤・通学者を減らし、混乱を和らげるようにしていました。
東京オリンピック 2020が2021年に延期されたことで、同じように2021年の祝日も一部移動させ、開会式と閉会式前後を連休にしようという案が2020年5月29日に内閣府から提出されていました（[平成三十二年東京オリンピック競技大会・東京パラリンピック競技大会特別措置法等の一部を改正する法律案](https://www.sangiin.go.jp/japanese/joho1/kousei/gian/203/pdf/t0802010562010.pdf)）。
2020年11月27日に衆参両院でその案が可決され、[平成三十二年東京オリンピック競技大会・東京パラリンピック競技大会特別措置法
等の一部を改正する法律](https://www.sangiin.go.jp/japanese/joho1/kousei/gian/203/pdf/s0802010562030.pdf)として、2020年12月4日に公布されました。

# 2021年の祝日

[平成三十二年東京オリンピック競技大会・東京パラリンピック競技大会特別措置法
等の一部を改正する法律](https://www.sangiin.go.jp/japanese/joho1/kousei/gian/203/pdf/s0802010562030.pdf) で変更される祝日をまとめると、以下のようになります。

| 祝日名 | 本来の日付 | 2021年 | 
| --- | --- | --- |
| 海の日 | 7月 第3月曜日 | 7月22日 木曜日 |
| スポーツの日 | 10月 第2月曜日 | 7月23日 金曜日 |
| 山の日 | 8月11日 | 8月8日 日曜日 |
| 山の日 振替休日 | - | 山の日が日曜日なのでその振替休日 |

ちょっと分かりづらいのでカレンダーにしてみます。

![2021年の祝日](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14366/12319eb2-8169-a14a-6178-137cdddad1cc.png)


# 祝日ライブラリの対応状況

祝日を自分で判定するのは骨が折れるので、たいていの場合はライブラリを利用すると思います。
2021年の祝日について、各言語の祝日判定機能を提供してくれるライブラリの対応状況を見ていきたいと思います。

## [日本の祝日データセット holiday-jp/holiday_jp](https://github.com/holiday-jp/holiday_jp)

まず、日本の祝日のデータセットを提供している [holiday-jp/holiday_jp](https://github.com/holiday-jp/holiday_jp) について確認しておきます。

「[Holiday accompanying coronation day #101](https://github.com/holiday-jp/holiday_jp/pull/110)」という、前述した2021年の祝日をデータセットに追加するプルリクが11月26日に出されています。
祝日についての法案が可決されたのが11月27日なので、毎度とても早い初動ですね。
実際の公布・施行を待ち、テストなどの修正をしたのち、12月2日にmasterへマージされています。

これから紹介するいくつかのライブラリはこのデータセットを利用しています。
しかしながら、このデータセットの更新を取り込んでいるかどうかはライブラリ次第なので、それぞれ確認が必要です。


## Perl

### [Calendar::Japanese::Holiday](https://metacpan.org/pod/Calendar::Japanese::Holiday) : 対応済み(2020/12/11)

2020年12月11日に2021年の祝日に対応した バージョン 0.07 がリリースされました。

## Ruby

### [holiday_jp](https://rubygems.org/gems/holiday_jp) : 対応済み(2020/12/09)

バージョン 0.8.0 で2021年の祝日に対応しました。


### [date-holiday](https://rubygems.org/gems/date-holiday) : 未対応(2020/12/16 現在)

現在のバージョンは 2018/12/14 にリリースされた 0.0.5 で、2021年の祝日には対応していません。
0.0.5 のリリースの際に、2019年、2020年の祝日への対応をしていたので、一応アクティブな gem ではあるはずです。


### [holidays](https://rubygems.org/gems/holidays) : 未対応(2020/12/16 現在)

全世界の祝日を集め、判定を行うライブラリです。現時点での最新のバージョンは 8.3.0 です。

これも、ライブラリとは別に[データセットを提供しているリポジトリ](https://github.com/holidays/definitions)が別に存在しています。
データセットも現時点では2021年の祝日には対応しておらず、2021年の祝日を追加する [Add 2021 jp holiday](https://github.com/holidays/definitions/pull/180) という PR が GitHub 上で出されています。


### [holiday_japan](https://rubygems.org/gems/holiday_japan) : 対応済み(2020/11/27)

内閣府から改正案が出せれた 5/29 に [move Marine day, Sports day, Mountain day for 2021 Olympic](https://github.com/masa16/holiday_japan/commit/8035ee2378d04a6a01bdfe5755da95b39d06c740) という commit が master ブランチへ push されていて、最終的に改正案が可決された 11/27 に 1.4.4 として RubyGems  へリリースされています。
祝日ライブラリ界では最速の対応と言っていいかもしれません。


### [holiday](https://rubygems.org/gems/holiday) : 未対応(2020/12/16 現在)

指定の形式のYAMLファイルを用意し、読み込ませることで祝日かどうかを判定できるライブラリのようです。
初回リリースの2011年9月からメンテナンスもされていないので、利用は推奨しません。


## JavaScript

### [@holiday-jp/holiday_jp](https://www.npmjs.com/package/@holiday-jp/holiday_jp) : 対応済み(2020/12/06)

holiday_jp データセットを利用しており、最新版のデータを取り込んだ差分が、v2.3.0 としてリリースされています。


## PHP

### [holiday_jp](https://packagist.org/packages/holiday-jp/holiday_jp) : 対応済み(2020/12/06)

holiday_jp データセットを利用しており、最新版のデータを取り込んだ差分が、v2.3.0 としてリリースされています。

## Java

### [holidayjp(holiday_jp)](https://bintray.com/pinemz/maven/holidayjp) : 未対応(2020/12/16 現在)

holiday_jp データセットを利用していますが、最新版の取り込みはまだされていません。
現在の最新のバージョンは、2.0.1 です。


## Swift

### [HolidayJp(holiday_jp)](https://github.com/holiday-jp/holiday_jp-swift) : 未対応(2020/12/16 現在)

holiday_jp データセットを利用していますが、最新版の取り込みはまだされていません。
最新のバージョンは、0.2.1 です。

## Go

### [flagday](https://github.com/pinzolo/flagday) : 対応済み(2020/09/01)

09/01 に [Add holiday definitions in 2021 with postponement of the Olympics](https://github.com/pinzolo/flagday/pull/6) という PR で対応されていました。


### [holiday_jp](https://github.com/holiday-jp/holiday_jp-go) : 未対応(2020/12/16 現在)

holiday_jp データセットを利用していますが、最新版の取り込みはまだされていません。
参照している holiday_jp データセットも、2019年にあった天皇の退位・即位による4月から5月にかけての10連休に対応していない少し古いものを参照しているようです。


## Elixir

### [holiday_jp](https://hex.pm/packages/holiday_jp) : 未対応(2020/12/16 現在)

holiday_jp データセットを利用していますが、最新版の取り込みはまだされていません。
現在の最新のバージョンは、0.3.6 です。