Goで日本の祝日・営業日計算を扱える jp-holidays を使ってみる
Goで日付まわりの処理を書いていると、今日は祝日かどうか、次の営業日はいつか、といった判定が必要になることがある。
https://github.com/rabitt1ove/jp-holidays は、日本の祝日判定と営業日計算を扱えるGoライブラリ。祝日名の取得や営業日判定に加えて、独自の休日も登録できる。外部パッケージに依存せず、祝日データは内閣府の公開データに準拠している。
README時点では1955年から2027年までに対応しており、祝日データも定期的に更新されている。
インストール
go get github.com/rabitt1ove/jp-holidays
祝日かどうかを判定する
まずは基本的な判定から。
package main
import (
"fmt"
"time"
jpholiday "github.com/rabitt1ove/jp-holidays"
)
func main() {
loc, _ := time.LoadLocation("Asia/Tokyo")
date := time.Date(2025, 1, 1, 0, 0, 0, 0, loc)
fmt.Println("祝日?:", jpholiday.IsHoliday(date))
fmt.Println("祝日名:", jpholiday.HolidayName(date))
fmt.Println("営業日?:", jpholiday.IsBusinessDay(date))
}
/*
実行結果:
祝日?: true
祝日名: 元日
営業日?: false
*/
2025年1月1日を渡すと、祝日であること、祝日名が元日であること、営業日ではないことが分かる。
祝日の一覧を取得する
年間や月単位、あるいは期間指定で祝日を取得できる。
list := jpholiday.HolidaysInYear(2025)
list := jpholiday.HolidaysInMonth(2025, 1)
start := time.Date(2025, 1, 1, 0, 0, 0, 0, loc)
end := time.Date(2025, 12, 31, 0, 0, 0, 0, loc)
list := jpholiday.HolidaysBetween(start, end)
用途に応じて粒度を変えられる。
営業日を扱う
営業日ベースの処理も用意されている。
next := jpholiday.NextBusinessDay(date)
prev := jpholiday.PreviousBusinessDay(date)
days := jpholiday.BusinessDaysBetween(start, end)
次の営業日、前の営業日、指定期間内の営業日数をそのまま取得できる。祝日判定と組み合わせて自前でロジックを書く必要がない。
カスタム休日を追加する
会社独自の休業日を加えたい場合は AddCustomHoliday を使う。
loc, _ := time.LoadLocation("Asia/Tokyo")
customDate := time.Date(2025, 4, 1, 0, 0, 0, 0, loc)
jpholiday.AddCustomHoliday(customDate, "創立記念日")
jpholiday.IsHoliday(customDate)
jpholiday.HolidayName(customDate)
/*
実行結果:
祝日?: true
祝日名: 創立記念日
*/
標準の祝日と同じ日にカスタム休日を設定した場合は、カスタム休日が優先される。一覧取得でも重複は発生しない。
設定を分離する
プロジェクトごとに休日定義を分けたいときは New で Calendar インスタンスを作る。
cal := jpholiday.New()
cal.AddCustomHoliday(customDate, "プロジェクト休暇")
cal.IsHoliday(customDate)
このインスタンスはデフォルト設定とは独立している。複数の休日ルールを同じアプリケーション内で扱う場合にも整理しやすい。
補足
- README時点では1955年から2027年までに対応している
- 日付は
Asia/Tokyoでtime.Dateを生成しておくと扱いやすい - 祝日データは定期的に更新される設計になっている
- 祝日判定から営業日計算までを一つのライブラリでまとめて扱える
- 依存を増やさずに日付ロジックを書きたい場面で収まりがよい