如何在Go中以毫秒获取Unix时间?
我有以下函数:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
我需要的精度较低,只需要毫秒。
如何在Go中以毫秒获取Unix时间?
我有以下函数:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
我需要的精度较低,只需要毫秒。
time
包添加了UnixMicro()
和UnixMilli()
,因此正确的答案应该是:time.Now().UnixMilli()
对于go v.1.16及更早版本:func makeTimestamp() int64 {
return time.Now().UnixNano() / 1e6
}
1e6
,即1 000 000,是一毫秒中的纳秒数。
这里有一个示例,您可以编译并运行以查看输出结果。
package main
import (
"time"
"fmt"
)
func main() {
a := makeTimestamp()
fmt.Printf("%d \n", a)
}
func makeTimestamp() int64 {
return time.Now().UnixNano() / 1e6
}
保持简单。
func NowAsUnixMilli() int64 {
return time.Now().UnixNano() / 1e6
}
正如@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
始终为毫秒的值,因此即使由于某种愚蠢的原因常量的值发生更改,将 UnixNano 除以 Millisecond 将始终返回毫秒值。 - OneOfOne(int64(time.Now().UnixNano() / int64(time.Nanosecond))/int64(time.Millisecond)
吗?维度分析 ns/(ms/ns)
返回 ns^2/ms
。你的答案也可以工作,因为 time.Nanosecond=1
,但单位不对... - The Puma如何在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
Playground: https://play.golang.org/p/JSExv5jw2ZW
在https://github.com/golang/go/issues/44196上,randall77建议
time.Now().Sub(time.Unix(0,0)).Milliseconds()
time.Duration
已经有Milliseconds
方法这一事实。我认为在除法运算之前,将时间四舍五入到毫秒会更好。
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 nowAsUnixMilliseconds(){
return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}
这个函数:
P.S. 我已经使用常量和组合分隔符运行了基准测试,它们显示几乎没有差别,所以您可以使用更易读或更符合语言规范的解决方案。
time.Now().UnixNano() * (time.Nanosecond / time.Millisecond)
。但是由于整数除法的原因,最好更改顺序:time.Nanosecond * time.Now().UnixNano() / time.Millisecond
。 - Jonnotime.Now().UnixNano() / int64(1e6)
。 - clay