GoでUnix時間をミリ秒単位で取得するにはどうすればよいですか?
次の機能があります。
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
精度の必要性は低く、ミリ秒のみが必要です。
それを分割するだけです:
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
コンパイルして実行して出力を確認できる例を次に示します
package main
import (
"time"
"fmt"
)
func main() {
a := makeTimestamp()
fmt.Printf("%d \n", a)
}
func makeTimestamp() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
@Jonoが@OneOfOneの回答で指摘しているように、正しい回答ではナノ秒の長さを考慮する必要があります。例えば:
func makeTimestamp() int64 {
return time.Now().UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
OneOfOneの答えは、time.Nanosecond
がたまたま1
であり、1で除算しても効果がないためです。これが将来どの程度変わる可能性があるかを知ることについては十分に知りませんが、厳密に正しい答えを出すには、OneOfOneの答えではなく、この関数を使用します。コンパイラーはこれを完全に最適化できるはずなので、パフォーマンス上の欠点はないと思います。
https://en.wikipedia.org/wiki/Dimensional_analysis を参照してください
これを見る別の方法は、time.Now().UnixNano()
とtime.Millisecond
の両方が同じ単位(ナノ秒)を使用することです。それが真実である限り、OneOfOneの答えは完璧に機能するはずです。
複雑にしないでおく。
func NowAsUnixMilli() int64 {
return time.Now().UnixNano() / 1e6
}
除算の前に時間をミリ秒に丸めた方が良いと思います。
func makeTimestamp() int64 {
return time.Now().Round(time.Millisecond).UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
プログラムの例を次に示します。
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(unixMilli(time.Unix(0, 123400000)))
fmt.Println(unixMilli(time.Unix(0, 123500000)))
m := makeTimestampMilli()
fmt.Println(m)
fmt.Println(time.Unix(m/1e3, (m%1e3)*int64(time.Millisecond)/int64(time.Nanosecond)))
}
func unixMilli(t time.Time) int64 {
return t.Round(time.Millisecond).UnixNano() / (int64(time.Millisecond) / int64(time.Nanosecond))
}
func makeTimestampMilli() int64 {
return unixMilli(time.Now())
}
上記のプログラムは私のマシンで以下の結果を出力しました:
123
124
1472313624305
2016-08-28 01:00:24.305 +0900 JST