Java

祝日、休日、営業日の判別を簡単に行えるJavaライブラリ japan-holidays をリリースしました #japanHolidays

「この日の翌営業日はいつなのか」「この日は祝日か」「最終営業日はいつか」「平日にバッチを動かしているが、祝休日には動かしたくない」、そんな要件が良くあります。

内閣府はsyukujitsu.csvというファイルで祝休日を公開しています。

これの情報をJavaプログラムで使いやすい形にするライブラリ japan-holidays をリリースしました。
GitHub – yusuke / japan-holidays

このライブラリは:
・内閣府の公式情報が元になっている
・定期的(約1ヶ月)毎に自動的に最新情報を取得する
・固定、またはロジックベースのカスタム休祝日を設定できる
・指定した日以降(以前)の最初の祝日(営業日)を取得するメソッドがある
・日本語話者が利用しやすい日本語APIを用意(英語APIもあり)
・Maven Central Repositoryにあるので簡単に利用できる
といった特徴があります。

どんなに簡単に使えるか、以下のコード例を見て頂くのが一番早いです。

public class Example {
    public static void main(String[] args) {
        日本の祝休日 holidays = new 日本の祝休日();

        // 元日なのでtrueが表示される
        System.out.println("2021年1月1日は祝日?: " + holidays.is祝休日(LocalDate.of(2021, 1, 1)));
        // 元日なのでfalseが表示される
        System.out.println("2021年1月1日は営業日?: " + holidays.is営業日(LocalDate.of(2021, 1, 1)));

        // 成人の日を取得
        Optional<祝休日> holiday = holidays.get祝休日(LocalDate.of(2021, 1, 11));
        holiday.ifPresent(e -> System.out.println("2021年1月11日は何の日?: " + e.名称));

        System.out.println("2021年5月の祝休日一覧: ");
        // 2021-05-03:憲法記念日、2021-05-04:みどりの日、2021-05-05:こどもの日 を表示
        holidays.get指定期間内の祝休日️(LocalDate.of(2021, 5, 1)
                , LocalDate.of(2021, 5, 31))
                .forEach(e -> System.out.println(e.日付 + ": " + e.名称));

        // 固定のカスタム祝休日を設定
        // メソッドチェーンで続けて書けるが、ミュータブルではなくオリジナルのインスタンスに変更が加わっていることに注意
        holidays.add祝休日(LocalDate.of(2013, 3, 29), "株式会社サムライズム設立")
                // ロジックベーのカスタム祝休日を設定。当該日が祝日ならば名称を、そうでなければnullを返す関数を指定する
                .add祝休日(e -> e.getDayOfWeek() == DayOfWeek.SATURDAY ? "土曜日" : null)
                .add祝休日(e -> e.getDayOfWeek() == DayOfWeek.SUNDAY ? "日曜日" : null)
                .add祝休日(e -> e.getMonthValue() == 12 && e.getDayOfMonth() == 31 ? "大晦日" : null);

        // 2021年1月最終営業日を取得→ 1月30日、31日が土日なので1月29日金曜日
        System.out.println("2021年最終営業日: " + holidays.以前の営業日(LocalDate.of(2021, 1, 31)));
        // 2020年大晦日以降最初の営業日を取得→ 1月1日は元日、1月2,3日はカスタム祝日(土日)なので1月4日月曜日
        System.out.println("2020年大晦日以降最初の営業日: " + holidays.以降の営業日(LocalDate.of(2020, 12, 31)));
        // 2021年2月22日以降最初の祝日を取得→ 2月23日 天皇誕生日
        System.out.println(holidays.以降の祝休日(LocalDate.of(2021, 2, 22)));
        // 2021年2月26日以前最初の祝日を取得→ 2月23日 天皇誕生日
        System.out.println(holidays.以前の祝休日(LocalDate.of(2021, 2, 26)));
    }
}

自社で必要になって開発したライブラリですが、これで実際に以下のような処理をします:
・毎日平日の朝10時、午後3時にラジオ体操を促すメッセージをSlackに流す(休日と判定できる場合はスキップ)
・銀行口座の明細を取得する処理を祝日はスキップする
・月末締翌月末支払の請求書に支払期日を記載する(「翌月最後の営業日」をライブラリで算出)

簡単に使えて応用の幅が広いライブラリなので是非お試しください。
GitHub – yusuke / japan-holidays

よくある質問
Q1 未来の祝日情報はいつまでとれますか?
A1 内閣府では2021年1月現在、の所2021年末の分まで公開しています。このライブラリでは31日毎に自動的に最新情報を取得しますのでsyukujitsu.csvが更新されればもっと先も取れるようになります。

Q2 カスタム祝休日はプログラムにハードコードしなければいけませんか?
A2 syukujitsu.csvのフォーマットで書いたファイルをWebサーバに配置し、システムプロパティ SYUKUJITSU_URL にURLを指定すればそちらを読みに行ってくれます。テキストファイルを編集するだけで祝休日の追加も削除も自由に行えるようになります。

Q3 カスタム祝休日は追加のみ?削除はできませんか?
A3 プログラムでは祝休日を削除する方法は現在用意していません。A2で説明する自前csvファイルを使う方法だと祝休日の削除も行えます。

Comments are closed.