Logo
About

golangで祝日判定と営業日計算できるライブラリを作った

2017/10/13

はじめに#


自分がGoでプログラムを組んでいたら営業日計算が必要な場合に遭遇しました. 基本的な営業日なので土日,祝日を除いた日での計算になります. そこまで複雑ではないしrubyならそれっぽいgemがあったはずだからGoでもあるだろうと探してもなかなか見つからない... apiを使用するとメンテコストが高いだろうと思いライブラリとして作りました.

リポジトリ#


https://github.com/yut-kt/goholiday

Install#


$ go get github.com/yut-kt/goholiday

goのライブラリはgopathがしっかり設定されていればこれだけで使用できるようになります.

Sample#


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書いているのは楽しいけど結構他の言語だとこうできるのになーとかこのライブラリないの!?みたいなことに陥るのでもっと言語自体もコミュニティも伸びて行って欲しいです. あともっとこんな機能があったら便利とかあればコメントいただけると追加や修正ができるかもしれないのでお願いします.