【发布时间】:2014-07-30 03:26:35
【问题描述】:
如何在 Go 中获取 Unix 时间(以毫秒为单位)?
我有以下功能:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
我需要更少的精度,只需要毫秒。
【问题讨论】:
标签: time go unix-timestamp date-conversion
如何在 Go 中获取 Unix 时间(以毫秒为单位)?
我有以下功能:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
我需要更少的精度,只需要毫秒。
【问题讨论】:
标签: time go unix-timestamp date-conversion
从 go v1.17 开始,time 包添加了 UnixMicro() 和 UnixMilli(),因此正确答案是:time.Now().UnixMilli()
分吧:
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)
}
【讨论】:
time.Now().UnixNano() * (time.Nanosecond / time.Millisecond)。但是,由于整数除法,最好更改顺序:time.Nanosecond * time.Now().UnixNano() / time.Millisecond
time.Nanosecond == 10 和time.Millisecond == 10,000,000,你的代码就会中断
正如@Jono 在@OneOfOne 的回答中指出的那样,正确的答案应该考虑到一纳秒的持续时间。例如:
func makeTimestamp() int64 {
return time.Now().UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond))
}
OneOfOne 的答案有效,因为 time.Nanosecond 恰好是 1,除以 1 无效。我不太了解 go 知道这在未来发生变化的可能性有多大,但对于严格正确的答案,我会使用这个函数,而不是 OneOfOne 的答案。我怀疑是否存在任何性能劣势,因为编译器应该能够很好地优化这一点。
见https://en.wikipedia.org/wiki/Dimensional_analysis
另一种看法是time.Now().UnixNano() 和time.Millisecond 使用相同的单位(纳秒)。只要这是真的,OneOfOne 的答案应该会非常有效。
【讨论】:
.UnixNano() 的值将始终以纳秒为单位,time.Millisecond 将始终为 well 的值,您猜对了, 毫秒,所以即使由于任何愚蠢的原因常量改变了值,将 UnixNano 除以毫秒将总是返回以毫秒为单位的值。
(int64(time.Now().UnixNano() / int64(time.Nanosecond))/int64(time.Millisecond)吗?维度分析ns/(ms/ns) 返回ns^2/ms。您的回答也有效,因为time.Nanosecond=1,但单位已关闭...
我认为最好在除法之前将时间四舍五入到毫秒。
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
【讨论】:
保持简单。
func NowAsUnixMilli() int64 {
return time.Now().UnixNano() / 1e6
}
【讨论】:
简单易读但精确的解决方案是:
func nowAsUnixMilliseconds(){
return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}
这个函数:
附:我已经使用常量和复合分隔符运行基准测试,它们几乎没有差异,因此请随意使用更具可读性或更严格语言的解决方案。
【讨论】:
https://github.com/golang/go/issues/44196randall77 建议
time.Now().Sub(time.Unix(0,0)).Milliseconds()
它利用了 Go 的 time.Duration 已经有 Milliseconds 方法这一事实。
【讨论】:
如何在 Go 中获取 Unix 时间(以毫秒为单位)?
不再以纳秒为单位进行划分。从 Go 1.17 开始,您可以直接使用 Time.UnixMilli 方法:
// a deterministic date value
t := time.Date(2021, 7, 16, 0, 0, 0, 0, time.UTC)
m := t.UnixMilli()
fmt.Println(m) // 1626393600000
【讨论】: