hnwの日記

date-holidays という祝日ライブラリが良い意味で狂っていた

世界には色々なマニアがいるなーという話を紹介します。

先日Node.jsで使える祝日ライブラリを探していたところ、複数の国や地域の祝日に対応しているライブラリ date-holidays を見つけました。

このライブラリは本稿執筆時点で143ヶ国379地域の祝日に対応しています。この時点で頭がおかしい(ほめ言葉)のがわかると思うんですが、さらに凄いのがこれらの祝日をすべてYAMLで定義しており、このYAMLが変態的だという点です。

YAMLによる祝日の定義例

どう凄いかは実際のYAMLを見た方が早いと思うので、例を紹介します。下記は日本の祝日の定義の一部です。

      01-15:
        name:
          en: Coming of Age Day
          jp: 成人の日
        active:
          - from: 1948-07-20
            to: 1999-12-31
      substitutes 01-15 and if sunday then next monday:
        substitute: true
        name:
          en: Coming of Age Day
          jp: 成人の日
        active:
          - from: 1973-04-12
            to: 1999-12-31
      2nd monday in January:
        name:
          en: Coming of Age Day
          jp: 成人の日
        active:
          - from: 2000-01-01

1949年から1月15日が成人の日として祝日になり、1973年4月12日から振替休日の制度がはじまり、2000年から1月の第二月曜日に移動した、という記述ができています。

次にアメリカの定義を紹介します。

      01-01 and if sunday then next monday if saturday then previous friday:
        substitute: true
        _name: 01-01

アメリカも日本と同じく1/1は祝日なのですが、1/1が日曜の場合は月曜に振替休日が、1/1が土曜の場合は金曜に振替休日が発生します。こんなノリで色々なパターンの振替休日に対応できます。

このようにYAMLのキーで祝日の定義を書いていくのですが、世界各国の祝日に対応できるような記述力を持っているのが凄い点です。世界には太陰暦イスラム暦ヘブライ暦を元にした祝日があるのですが、これらにももちろん対応しています。作者の人、祝日が好きすぎでは…?

下記ディレクトリに全てのYAMLがありますので、祝日マニアの方は是非見てみてください。

日本の祝日も対応したつもり

私がこのライブラリを見つけた時点では日本の祝日が不完全でした。2019・2020年の特例に対応していなかったり山の日が大昔からあったことになっていたり実際と異なる点があったので、私の方でPull Requestを送ったところ、無事採用されました。

何十年分かはカレンダーと見比べたりしたつもりですが、まだ問題が残っているようなら教えて頂けると嬉しいです。

また、現時点で欧米のカレンダーはかなり正しそうですが、中国の祝日は不完全な気がします(連休を作るための振替出勤日に対応できていない、そもそもライブラリ側で全く想定できていない気がする)。

まだまだ世界制覇の道のりは長そうですが、このライブラリで世界中の祝日がサポートできたら楽しいですね。