如何以毫秒为单位在Go中获得Unix时间?
我有以下功能:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
我需要更少的精度,只需要几毫秒。
答案 0 :(得分:84)
除以它:
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)
}
答案 1 :(得分:51)
正如@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的答案应该能够很好地运作。
答案 2 :(得分:21)
保持简单。
func NowAsUnixMilli() int64 {
return time.Now().UnixNano() / 1e6
}
答案 3 :(得分:5)
如何以毫秒为单位在 Go 中获取 Unix 时间?
不再有来自纳秒的划分。从 Go 1.17(将于 2021 年 8 月发布)开始,您可以直接使用 Time.UnixMilli
方法:
// a deterministic date value
t := time.Date(2021, 7, 16, 0, 0, 0, 0, time.UTC)
m := t.UnixMilli()
fmt.Println(m) // 1626452451627
答案 4 :(得分:1)
在 https://github.com/golang/go/issues/44196 randall77 建议
time.Now().Sub(time.Unix(0,0)).Milliseconds()
利用 Go 的 time.Duration
已有 Milliseconds
方法这一事实。
答案 5 :(得分:0)
我觉得将分割前的时间缩短到毫秒是更好的。
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
答案 6 :(得分:0)
简单阅读但精确的解决方案是:
func nowAsUnixMilliseconds(){
return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}
此功能:
P.S。我已经使用恒定和复合分隔符运行基准测试,它们几乎没有差异,因此请随时使用更具可读性或更多语言限制的解决方案。