5
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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

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

こんな変換です。

各プログラム

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

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

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)

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型に変換処理を追加しています。

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)

コメントをいただきまして、こちらの方法だと、タイムゾーンの問題でズレが発生するそうで、https://qiita.com/go_sagawa/items/836398020100df486184 の記事をご覧いただけたほうが良さそうです。

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タイムで計算する方法が早そうです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
5
Help us understand the problem. What are the problem?