如何在Go中以毫秒为单位获取Unix时间?
我有以下功能:
func makeTimestamp() int64 {
return time.Now().UnixNano() % 1e6 / 1e3
}
我需要的精度较低,只需要毫秒。
Answers:
只需将其划分:
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的答案就可以很好地工作。
.UnixNano()
将始终是在十亿分之一秒的时间,time.Millisecond
将始终是值好了,你猜对了,一毫秒,所以即使任何愚蠢的理由不断变化值,除以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 nowAsUnixMilliseconds(){
return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}
该功能:
PS我已经使用恒定和复合分隔符运行基准测试,它们几乎没有差异,因此请随时使用更具可读性或更多语言限制的解决方案。
time.Now().UnixNano() * (time.Nanosecond / time.Millisecond)
。但是,最好由于整数除法来更改顺序:time.Nanosecond * time.Now().UnixNano() / time.Millisecond