1. spiegel-im-spiegel

    Posted

    spiegel-im-spiegel
Changes in title
+「プレミアムフライデー」を求める関数を作ってみた
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,75 @@
+(これは私のブログ記事「[「プレミアムフライデー」を求めるパッケージを作ってみた](http://text.baldanders.info/golang/premium-friday/)」からの一部転載です)
+
+そういえば先月の「プレミアムフライデー」,皆様はいかがお過ごしでしたか。私は3時間も残業してしまいましたよ(笑)
+
+ちうわけで,以下を真似して「プレミアムフライデー」を求める関数を考えてみる。もちろん息抜きである。潤いは大事。でも実用性はないと思われ。
+
+- [プレミアムフライデーを求めるメソッドを作った - Qiita](http://qiita.com/neko_the_shadow/items/4ebf94a8a6d9282e7207)
+- [プレミアムフライデーを求めるメソッドを作った(Java8版) - Qiita](http://qiita.com/deaf_tadashi/items/963a62072338f09f12a5)
+
+とりあえずベタに書いてみる。
+
+```go: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)。実行結果は以下の通り。
+
+```text
+$ go run pf.go 2017 2
+24
+```
+
+期待通りの値が得られた。