post Image
Go言語で祝日判定と営業日計算できるライブラリを作った

はじめに

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

リポジトリ

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

Install

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

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

Sample

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


『 Go 』Article List
Category List

Eye Catch Image
Read More

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Eye Catch Image
Read More

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。