Go
golang

「プレミアムフライデー」を求める関数を作ってみた

More than 1 year has passed since last update.

(これは私のブログ記事「「プレミアムフライデー」を求めるパッケージを作ってみた」からの一部転載です)

そういえば先月の「プレミアムフライデー」,皆様はいかがお過ごしでしたか。私は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

期待通りの値が得られた。

ブックマーク