(これは私のブログ記事「「プレミアムフライデー」を求めるパッケージを作ってみた」からの一部転載です)
そういえば先月の「プレミアムフライデー」,皆様はいかがお過ごしでしたか。私は3時間も残業してしまいましたよ(笑)
ちうわけで,以下を真似して「プレミアムフライデー」を求める関数を考えてみる。もちろん息抜きである。潤いは大事。でも実用性はないと思われ。
とりあえずベタに書いてみる。
pf.go
package main
import (
"flag"
"fmt"
"os"
"strconv"
"time"
)
//GetPremiumFriday returns day of premium friday
func GetPremiumFriday(y int, m time.Month) (int, error) {
//引数のチェック
if y < 2017 || m < time.January || m > time.December {
return 0, os.ErrInvalid
}
if y == 2017 && m < time.February { //2017年1月は実施前なのでエラー
return 0, os.ErrInvalid
}
//指定月末(翌月0日)で初期化する
tm := time.Date(y, m+1, 0, 0, 0, 0, 0, time.UTC) //時差は影響しないので,とりあえず UTC で
w := tm.Weekday() - time.Friday
if w < 0 {
w += 7
}
return tm.Day() - (int)(w), nil
}
func main() {
flag.Parse()
argsStr := flag.Args()
if len(argsStr) < 2 {
fmt.Fprintln(os.Stderr, "年月を指定してください")
return
}
args := make([]int, 2)
for i := 0; i < 2; i++ {
num, err := strconv.Atoi(argsStr[i])
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
args[i] = num
}
d, err := GetPremiumFriday(args[0], time.Month(args[1]))
if err != nil {
fmt.Fprintln(os.Stderr, err)
return
}
fmt.Println(d)
}
指定月末を求めるのに「翌月0日」で初期化するのがポイント(つか,ここしかポイントになるものがないw)。実行結果は以下の通り。
$ go run pf.go 2017 2
24
期待通りの値が得られた。