自分がGoでプログラムを組んでいたら営業日計算が必要な場合に遭遇しました. 基本的な営業日なので土日,祝日を除いた日での計算になります. そこまで複雑ではないしrubyならそれっぽいgemがあったはずだからGoでもあるだろうと探してもなかなか見つからない... apiを使用するとメンテコストが高いだろうと思いライブラリとして作りました.
https://github.com/yut-kt/goholiday
$ go get github.com/yut-kt/goholiday
goのライブラリはgopathがしっかり設定されていればこれだけで使用できるようになります.
package main
import (
"fmt"
"time"
"github.com/yut-kt/goholiday" // ライブラリインポート
)
func main() {
NYD := "2018-01-01"
datetime, err := time.Parse("2006-01-02", NYD)
if err != nil {
panic(err)
}
// X営業日後を計算
fmt.Println(goholiday.BusinessDaysAfter(datetime, 20))
// X営業日前を計算
fmt.Println(goholiday.BusinessDaysBefore(datetime, 20))
// 祝日かどうか判定
fmt.Println(goholiday.IsNationalHoliday(datetime))
// 営業日かどうか判定
fmt.Println(goholiday.IsBusinessDay(datetime))
}
今回はパフォーマンスよりも安定性を意識して作ったので少し遅く感じるかもしれませんが,そこまで時間がかかるわけでもないので計算が面倒と感じたら使えるレベルかなと思います.
ベンチマーク載せておきます.判定は0.0002ms,営業日計算は0.002sほどかかっています. バージョンアップして当初から数百倍の速度にはしてあるので実用できそうかと思います.
goos: darwin
goarch: amd64
pkg: github.com/yut-kt/goholiday
BenchmarkIsNationalHoliday-4 10000000 222 ns/op 16 B/op 1 allocs/op
BenchmarkIsNationalHoliday-4 10000000 233 ns/op 16 B/op 1 allocs/op
BenchmarkIsNationalHoliday-4 10000000 235 ns/op 16 B/op 1 allocs/op
BenchmarkIsNationalHoliday-4 10000000 224 ns/op 16 B/op 1 allocs/op
BenchmarkIsNationalHoliday-4 10000000 226 ns/op 16 B/op 1 allocs/op
BenchmarkIsWeekDay-4 10000000 199 ns/op 11 B/op 0 allocs/op
BenchmarkIsWeekDay-4 10000000 200 ns/op 11 B/op 0 allocs/op
BenchmarkIsWeekDay-4 10000000 200 ns/op 11 B/op 0 allocs/op
BenchmarkIsWeekDay-4 10000000 185 ns/op 11 B/op 0 allocs/op
BenchmarkIsWeekDay-4 10000000 192 ns/op 11 B/op 0 allocs/op
BenchmarkBusinessDaysBefore-4 10000 2368289 ns/op 83723 B/op 5225 allocs/op
BenchmarkBusinessDaysBefore-4 10000 2153245 ns/op 83723 B/op 5225 allocs/op
BenchmarkBusinessDaysBefore-4 10000 2122294 ns/op 83723 B/op 5225 allocs/op
BenchmarkBusinessDaysBefore-4 10000 2179232 ns/op 83723 B/op 5225 allocs/op
BenchmarkBusinessDaysBefore-4 10000 2091056 ns/op 83723 B/op 5225 allocs/op
BenchmarkBusinessDaysAfter-4 10000 2033209 ns/op 80509 B/op 5024 allocs/op
BenchmarkBusinessDaysAfter-4 10000 1923448 ns/op 80509 B/op 5024 allocs/op
BenchmarkBusinessDaysAfter-4 10000 1973427 ns/op 80509 B/op 5024 allocs/op
BenchmarkBusinessDaysAfter-4 10000 2109766 ns/op 80509 B/op 5024 allocs/op
BenchmarkBusinessDaysAfter-4 10000 1909945 ns/op 80509 B/op 5024 allocs/op
PASS
ok github.com/yut-kt/goholiday 244.707s
さらにベンチマーク改善しました
goos: darwin
goarch: amd64
pkg: github.com/yut-kt/goholiday
BenchmarkIsNationalHoliday-4 10000000 154 ns/op 16 B/op 1 allocs/op
BenchmarkIsNationalHoliday-4 10000000 146 ns/op 16 B/op 1 allocs/op
BenchmarkIsNationalHoliday-4 10000000 151 ns/op 16 B/op 1 allocs/op
BenchmarkIsNationalHoliday-4 10000000 147 ns/op 16 B/op 1 allocs/op
BenchmarkIsNationalHoliday-4 10000000 148 ns/op 16 B/op 1 allocs/op
BenchmarkIsHoliday-4 10000000 132 ns/op 11 B/op 0 allocs/op
BenchmarkIsHoliday-4 10000000 127 ns/op 11 B/op 0 allocs/op
BenchmarkIsHoliday-4 10000000 127 ns/op 11 B/op 0 allocs/op
BenchmarkIsHoliday-4 10000000 129 ns/op 11 B/op 0 allocs/op
BenchmarkIsHoliday-4 10000000 130 ns/op 11 B/op 0 allocs/op
BenchmarkIsBusinessDay-4 10000000 136 ns/op 11 B/op 0 allocs/op
BenchmarkIsBusinessDay-4 10000000 132 ns/op 11 B/op 0 allocs/op
BenchmarkIsBusinessDay-4 10000000 135 ns/op 11 B/op 0 allocs/op
BenchmarkIsBusinessDay-4 10000000 135 ns/op 11 B/op 0 allocs/op
BenchmarkIsBusinessDay-4 10000000 133 ns/op 11 B/op 0 allocs/op
BenchmarkBusinessDaysBefore-4 10000 1479924 ns/op 83720 B/op 5225 allocs/op
BenchmarkBusinessDaysBefore-4 10000 1472594 ns/op 83720 B/op 5225 allocs/op
BenchmarkBusinessDaysBefore-4 10000 1470252 ns/op 83720 B/op 5225 allocs/op
BenchmarkBusinessDaysBefore-4 10000 1471314 ns/op 83720 B/op 5225 allocs/op
BenchmarkBusinessDaysBefore-4 10000 1467807 ns/op 83720 B/op 5225 allocs/op
BenchmarkBusinessDaysAfter-4 10000 1409322 ns/op 80508 B/op 5024 allocs/op
BenchmarkBusinessDaysAfter-4 10000 1418852 ns/op 80508 B/op 5024 allocs/op
BenchmarkBusinessDaysAfter-4 10000 1417755 ns/op 80508 B/op 5024 allocs/op
BenchmarkBusinessDaysAfter-4 10000 1410596 ns/op 80508 B/op 5024 allocs/op
BenchmarkBusinessDaysAfter-4 10000 1424299 ns/op 80508 B/op 5024 allocs/op
PASS
ok github.com/yut-kt/goholiday 180.197s
Go書いているのは楽しいけど結構他の言語だとこうできるのになーとかこのライブラリないの!?みたいなことに陥るのでもっと言語自体もコミュニティも伸びて行って欲しいです. あともっとこんな機能があったら便利とかあればコメントいただけると追加や修正ができるかもしれないのでお願いします.