#平成最後 のクリスマスに贈る、2019年の祝日対応と改元の話

Hi, Everyone! Merry Christmas!
平成最後のクリスマス、どうお過ごしでしょうか？
僕？僕は感染性胃腸炎でダウンして寝込んでいました。
心は元気なのでこうしてテンション高めに記事を書いています。

さて、**"平成最後の"**クリスマスということで、エンジニアとして気になるのは改元後の元号と、天皇即位による2019年（xx元年）の祝日の変更ですよね。

## 改元

~~いくつかのニュース記事[^1] [^2] によると新しい元号は2019年（平成31年）4月1日以降の発表という話ですが、発表の日付も正式に決まっておらずなんとも言えない気持ちになります。~~
「[新元号、４月１日に発表　首相が正式表明：朝日新聞デジタル](https://www.asahi.com/articles/ASM144STGM14UTFK005.html)」と、4/1に発表と正式に決まりました。
これを機に各システムともに西暦での表示に統一したほうがいいのではないでしょうか……。
幸せなことに、自分が現在関わっているプロダクトには元号表記はないので対応する手間がなくホッとしています。

[^1]: [新元号公表は4月1日以降　政府が調整 - FNN.jpプライムオンライン : https://www.fnn.jp/posts/00406989CX](https://www.fnn.jp/posts/00406989CX)
[^2]: [新元号公表、来年４月に＝１月にも段取り発表－政府調整：時事ドットコム : https://www.jiji.com/jc/article?k=2018120500687](https://www.jiji.com/jc/article?k=2018120500687)

## 祝日

2019年（xx元年）の祝日ですが、2018年（平成30年）12月8日に可決され、同年12月14日に[「天皇の即位の日及び即位礼正殿の儀の行われる日を休日とする法律（平成30年法律第99号）」](https://www8.cao.go.jp/chosei/shukujitsu/sokuijoubun.pdf)として公布・施行され、天皇が即位される日である5月1日と、即位礼正殿の儀が行われる10月22日が2019年（xx元年）1年限りの祝日となりました。

さらに、5月1日の前後の4月30日と5月2日は、祝日である4月29日の昭和の日と5月3日の憲法記念日にそれぞれ挟まれており、その前日及び翌日が祝日である日は休日扱いとなるいわゆる「国民の休日」となります。（[
国民の祝日に関する法律](http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail?lawId=323AC1000000178) 第3条第3項 『その前日及び翌日が「国民の祝日」である日（「国民の祝日」でない日に限る。）は、休日とする。』）
そのため、前後の土日やその他の祝日をあわせて10連休という大型の連休が発生します。

それとは別に、天皇の入れ替わりに伴い「天皇誕生日」は12月23日から2月23日に変更になります。（[天皇の退位等に関する皇室典範特例法（平成29年法律第63号）](http://elaws.e-gov.go.jp/search/elawsSearch/elaws_search/lsg0500/detail/429AC0000000063_20190501_000000000000000/0?revIndex=2&lawId=429AC0000000063) 第10条 / 2019年5月1日施行）
そのため、2019年は「天皇誕生日」という祝日が存在しない年となります。

詳細は、[内閣府のWebサイトの「国民の祝日について」のページ](https://www8.cao.go.jp/chosei/shukujitsu/gaiyou.html) を確認してください。

### 2020年以降の祝日

せっかく祝日について触れたので、ここで2020年以降の祝日についても触れておきましょう。
2020年にも祝日の変更があります。

2020年東京オリンピックがある2020年以降の「体育の日」を「スポーツの日」と改名されます。（[国民の祝日に関する法律の一部を改正する法律（平成30年法律第57号）](http://www.shugiin.go.jp/internet/itdb_housei.nsf/html/housei/19620180620057.htm)）
さらに、**2020年に限っては**、その「体育の日」改め「スポーツの日」が7月24日（金）へ、普段は7月第3月曜日である「海の日」は7月23日（木）へ、普段は8月11日である「山の日」は8月10日へ変更されます。（[平成三十二年東京オリンピック競技大会・東京パラリンピック競技大会特別措置法及び平成三十一年ラグビーワールドカップ大会特別措置法の一部を改正する法律](http://www.shugiin.go.jp/internet/itdb_housei.nsf/html/housei/19620180620055.htm)）

7月24日は2020年東京オリンピックの開催式であるため、前回の1964年東京オリンピックは10月10日に開催式を行いその後に10月10日を体育の日とした経緯から、それと同様にスポーツの日（体育の日）と開催式を合わせたいようです。また、海の日を移動することで土日を合わせて4連休を作ることで、東京オリンピックの盛り上げと4連休による需要を生もうという意図があるようです。
同じく2020年東京オリンピックの閉会式が8月9日（日）のため、それに合わせて山の日を8月10日に移動することで3連休として遠方からの参加もしやすいようにしているようです。

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

ここまでが改元後の元号と、天皇即位による2019年（xx元年）の祝日の変更の話の整理でした。

さて、改元後の元号はまだ決まってもいないので、とりあえず仮置きして処理を書いたり、各言語やライブラリのアップデート（場合によってはOSのアップデート??）をする必要があります。
この話はまたいつかすることにして、今回の主題である祝日の対応の話をしましょう。

祝日に関しては、前述したとおり、法律も公布・施行されており確実な対応が可能です。
対応が可能ではありますが、自分で祝日判定を書くのも面倒なので大半がOSSライブラリを利用しているかと思います。
自分で書いている方は頑張って今回の祝日を追加してください。

では、そのOSSライブラリたちの2019年祝日への対応状況を各言語ごとに確認してみましょう。（紹介したもの以外にこんなライブラリもあるよというのがあれば教えていただけると嬉しいです）
2019年の祝日と、2020年以降の祝日の両方の対応が入っている場合は「対応済み」、それ以外の場合は「未対応」としています。カッコの日付は対応日または確認日です。
2020年以降の祝日の決定のほうが先なので、2019年の祝日対応が入っているということは、2020年以降の祝日についても追従済みという認識で問題ありません。

### [日本の祝日データセット 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/101)」という前述した2019年の祝日をデータセットに追加するプルリクが12月8日に出されています。
祝日についての法案が可決されたのが12月8日なのでとても早い初動ですね。
実際の公布・施行を待ち、テストなどの修正をしたのち、12月23日にmasterへマージされています。

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


### Perl

#### [Calendar::Japanese::Holiday](https://metacpan.org/pod/Calendar::Japanese::Holiday) : 対応済み(2019/01/19)

~~2018年12月25日現在、2019年の祝日について未対応です。最新のバージョンは 0.04 です。
ソースコードがGitHubやBitBucket等で公開されておらずこちらからコントリビュートできない状態ですが、作者の方のサイト（Wiki）を見るといまもネット上で活動されているようなので、対応される可能性はあります。~~
2019年1月19日に2019年, 2020年以降の祝日に対応した バージョン 0.05 がリリースされました。

年と月を渡すとその月の祝日を返してくれる関数と、指定の日付が祝日かどうか（祝日の場合は祝日名を返す）を返す関数を提供しています。

```perl
use strict;
use warnings;
use feature qw/say/;

use Data::Dumper;
use Calendar::Japanese::Holiday;

my $holidays = getHolidays(2019, 5);
say Dumper $holidays; # => { '3' => '憲法記念日', '4' => 'みどりの日', '5' => '子供の日' }

my $name;
$name = isHoliday(2019, 5, 1);
say $name; # => '天皇の即位の日'
$name = isHoliday(2019, 5, 3);
say $name; # => '憲法記念日'
```

#### その他ライブラリ

metacpanを検索すると、[Date::Japanese::Holiday](https://metacpan.org/pod/Date::Japanese::Holiday) や [Tripletail::DateTime::JPHoliday](https://metacpan.org/pod/Tripletail::DateTime::JPHoliday) がヒットすると思いますが、2019年の祝日以前に山の日などに対応しておらず更新される気配がないので利用は推奨しません。

### Ruby

#### [holiday_jp](https://rubygems.org/gems/holiday_jp) : 対応済み(2019/02/25)

~~前述した、holiday_jpデータセットを利用していますが、最新版の取り込みはまだされていません。~~ →使用していませんでした（2019/2/25追記）
~~現在最新のバージョンは、0.7.0 です。~~
バージョン 0.7.1 で2019年の祝日に対応しました。


#### [date-holiday](https://rubygems.org/gems/date-holiday) : 対応済み(2018/12/14)

version 0.0.5で対応されています。

標準のDateクラスを拡張する形で提供されています。
祝日か否かの判定のみを提供し、その日が何の祝日かどうかは扱いません。

```ruby
require 'date'
require 'date/holiday'

Date.new(2019, 5, 1).national_holiday? # => true
```

#### [holidays](https://rubygems.org/gems/holidays) : 対応済み(2019/02/03)

全世界の祝日を集め、判定を行うライブラリです。~最新のバージョンは 7.0.0 です。~
7.0.0の時点で天皇誕生日の変更と2020年以降の祝日の変更には対応しているようです。
バージョン 7.1.0 で、2019年の祝日にも対応しました。

これも、ライブラリとは別に[データセットを提供しているリポジトリ](https://github.com/holidays/definitions)が別に存在しています。
~データセットも2019年の祝日には対応していません。~ データセットは、2019/01/09に、2019年の祝日にも対応しました。

日付を渡すとその日の祝日名を返してくれます。

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

12月11日に「[add exceptional holidays in 2019 #4](https://github.com/masa16/holiday_japan/pull/4)」というプルリクが出されその日のうちにマージされています。
12月12日にバージョン 1.4.2 としてRubyGemsへリリースされました。


#### [holiday](https://rubygems.org/gems/holiday) : 未対応(2018/12/25)

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


### JavaScript

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

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


### PHP

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

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

### Java

#### [holidayjp(holiday_jp)](https://bintray.com/pinemz/maven/holidayjp) : 未対応(2018/12/25)

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


### Swift

#### [HolidayJp(holiday_jp)](https://github.com/holiday-jp/holiday_jp-swift) : 未対応(2018/12/25)

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

### Go

#### [flagday](https://github.com/pinzolo/flagday) : 対応済み(2018/12/14)

12月14日に https://github.com/pinzolo/flagday/commit/78947da68291311c3e5bd55621c595622791c827 というコミットで対応されていました。

#### [holiday_jp](https://github.com/holiday-jp/holiday_jp-go) : 未対応(2018/12/25)

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

### Elixir

#### [holiday_jp](https://hex.pm/packages/holiday_jp) : 対応済み(2018/12/28)

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

holiday_jpデータセットを利用しています。
2018/12/28に最新版のデータセットを取り込み、バージョン 0.3.3 としてリリースされています。