Go
golang
benchmark

golangのtime.Timeの当日00:00:00を取得する方法とベンチマーク

More than 3 years have passed since last update.

その日の00:00:00を取得したい場合、ありますよね。

例:2015-10-20 12:12:34 --> 2015-10-20 00:00:00

こんな変換です。


各プログラム

使用しているコードをushios/benchmark-go-zerodateに公開しました。


文字列にいちど変換する奴(BenchmarkZeroHourUsingFmt)

http://play.golang.org/p/Rgh2t9wtAh

now := time.Now()

st := fmt.Sprintf("%s 00:00:00 %s", now.Format("2006-01-02"), now.Format("-0700"))
day, _ := time.Parse("2006-01-02 15:04:05 -0700", st)

fmt.Println(day)


ちゃんと計算する奴(BenchmarkZeroHourUsingFormat)

http://play.golang.org/p/rmQJ949RFK

now := time.Now()

nanosecond := time.Duration(now.Nanosecond())
second := time.Duration(now.Second())
minute := time.Duration(now.Minute())
hour := time.Duration(now.Hour())
dur := -1 * (nanosecond + second*time.Second + minute*time.Minute + hour*time.Hour)
day := now.Add(dur)

fmt.Println(day)


@heliac2000 さんのコメントから(BenchmarkZeroHourUsingAdd)

他の処理と合わせるために、time.Time型に変換処理を追加しています。

http://play.golang.org/p/MY1iGNKTcz

now := time.Now()

st := time.Now().Format("2006-01-02 00:00:00 -0700 MST")
day, _ := time.Parse("2006-01-02 15:04:05 -0700 MST", st)

fmt.Println(day)


@spiegel-im-spiegel さんのコメントから(BenchmarkZerHourUnixTime)

http://play.golang.org/p/nBkuBjtjoH

now := time.Now()

ut := now.Unix()
_, offset := now.Zone()
day := time.Unix((ut/86400)*86400-int64(offset), 0)

fmt.Println(day)


ベンチマーク結果

BenchmarkZeroHourUsingFmt-8      1000000          1410 ns/op

BenchmarkZeroHourUsingFormat-8 1000000 1093 ns/op
BenchmarkZeroHourUsingAdd-8 10000000 169 ns/op
BenchmarkZerHourUnixTime-8 10000000 120 ns/op

@spiegel-im-spiegel さんのUNIXタイムで計算する方法が早そうです。