如何在Go中获得以毫秒为单位的Unix时间?
我具有以下功能:
1 2 3 | func makeTimestamp() int64 { return time.Now().UnixNano() % 1e6 / 1e3 } |
我需要的精度较低,只需要毫秒。
只需将其划分:
1 2 3 | func makeTimestamp() int64 { return time.Now().UnixNano() / int64(time.Millisecond) } |
这里是一个示例,您可以编译并运行以查看输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | package main import ( "time" "fmt" ) func main() { a := makeTimestamp() fmt.Printf("%d \ ", a) } func makeTimestamp() int64 { return time.Now().UnixNano() / int64(time.Millisecond) } |
- 上面的计算并没有任何意义。您不会将纳秒除以毫秒。碰巧是golang选择表示时间到纳秒以下,常数"毫秒"为1,000,000。从数学上讲,计算应为:
time.Now().UnixNano() * (time.Nanosecond / time.Millisecond) 。但是,由于整数除法,最好更改顺序:time.Nanosecond * time.Now().UnixNano() / time.Millisecond - 可能需要一些强制转换。o / w应该没问题。
-
感谢那。请注意,我并不是说您得到了错误的结果。只是计算没有意义,而您正在使用有关go常数的信息。如果明天使用的新版本为时间单位选择更高的精度,例如
time.Nanosecond == 10 和time.Millisecond == 10,000,000 ,则您的代码将中断 - @Jonno在1.x发布周期中保证所有内置常量(和库方法)。 golang.org/doc/go1compat
- 感谢那。欢迎您依靠该保证,但这实际上是一个Y2K错误。它可能会在将来的某个时候中断。为什么选择错误的数学表示形式?
- @Jonno我不确定您在说什么,纳秒/毫秒是数学常数。 golang.org/src/pkg/time/time.go#L450
- 它们是任意常数。它们将来可能会改变。时间包目前可以纳秒精度"工作",但这是导致设置时间的任意选择。毫秒= 1,000,000。请注意,即使在您引用的同一文件中,time.Milisecond也设置为1000 * Microsecond,因为从数学上讲,这就是它应该表示的内容。我要下线-希望我的解释有所帮助
- -1这是错误的。您的单位不累加。从物理学中查找尺寸分析。您的结果不代表时间。
- @OneOfOne您得到了正确的答案,并在代码中进行了证明。
- 忙碌的人们的快速解答。看看https://gobyexample.com/epoch
- 应该是:return time.Now()。UnixNano()/ 1000/1000
- 为什么不只使用time.Now()。Unix而不是进行转换?
- Unix()返回秒。
-
这个答案是完全错误的。请使用
time.Now().UnixNano() / int64(1e6) 。 - @clay这个答案适用于所有1.x.x版本,for没错,
正如@Jono在@OneOfOne的答案中指出的那样,正确的答案应考虑一纳秒的持续时间。例如:
1 2 3 | func makeTimestamp() int64 { return time.Now().UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond)) } |
OneOfOne的答案之所以有效,是因为
请参阅https://en.wikipedia.org/wiki/Dimensional_analysis
另一种查看方式是
-
.UnixNano() 的值将始终是纳秒级的时间,time.Millisecond 的值将始终是毫秒级的值,您猜到了,以毫秒为单位,因此,即使出于任何愚蠢的原因,常量将值更改,也总是将UnixNano除以毫秒返回值(以毫秒为单位)。 - Unix.Nano的单位不成问题;时间的价值也不是毫秒。问题是时间单位毫秒。它恰好以纳秒为单位定义,这就是您的答案起作用的原因。如果用其他单位(例如微秒)来度量time.Milliseconds,则您给出的答案将无效。
-
@BjornRoche我参加这个聚会有点晚了,但是正确的答案不是
(int64(time.Now().UnixNano() / int64(time.Nanosecond))/int64(time.Millisecond) 吗?尺寸分析ns/(ms/ns) 返回ns^2/ms 。您的答案也有效,因为time.Nanosecond=1 ,但是单位已关闭... - @thepuma已经有一段时间了,所以我可能正在看这个错误或误解您,但是ns /(ms / ns)等效于ns ^ 2 / ms,因此这两个答案都应该起作用。
- 这个答案是正确的,因为运行此命令将显示与使用在线转换器unitconverters.net/prefixes/nano-to-milli.htm进行转换时相同的结果
- @thebiggestlebowski希望编译器可以为您解决这个问题,但是我对Go并不十分了解。
保持简单。
1 2 3 | func NowAsUnixMilli() int64 { return time.Now().UnixNano() / 1e6 } |
我认为最好在除法之前将时间舍入到毫秒。
1 2 3 | func makeTimestamp() int64 { return time.Now().Round(time.Millisecond).UnixNano() / (int64(time.Millisecond)/int64(time.Nanosecond)) } |
这是一个示例程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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()) } |
上面的程序在我的机器上打印以下结果:
1 2 3 4 | 123 124 1472313624305 2016-08-28 01:00:24.305 +0900 JST |
- 您忘了提到为什么您认为最好将时间舍入到毫秒。
简单阅读但精确的解决方案是:
1 2 3 | func nowAsUnixMilliseconds(){ return time.Now().Round(time.Millisecond).UnixNano() / 1e6 } |
此功能:
P.S。我已经使用恒定和复合分隔符运行基准测试,它们几乎没有区别,因此请随时使用更具可读性或更多语言限制的解决方案。
- 如果您想知道正确的Unix时间(以毫秒为单位)(自大纪元以来的毫秒数),则不应使用Round(),因为这将舍入一半的时间,然后结果将包含尚未完全过去的毫秒。
- 感谢@torbenl的注释-这对于大多数系统而言可能很重要(我的排除在外,此时间仅用于历史记录)。
在https://github.com/golang/go/issues/44196建议randall77
1 | time.Now().Sub(time.Unix(0,0)).Milliseconds() |
利用Go的