Go / golang time.Now()。UnixNano()转换为毫秒?

时间:2014-06-09 14:49:08

标签: time go unix-timestamp date-conversion

如何以毫秒为单位在Go中获得Unix时间?

我有以下功能:

func makeTimestamp() int64 {
    return time.Now().UnixNano() % 1e6 / 1e3
}

我需要更少的精度,只需要几毫秒。

7 个答案:

答案 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
}

此功能:

  1. 将值正确舍入到最接近的毫秒数(与整数除法比较:它只丢弃结果值的小数部分);
  2. 不会深入研究时间的特定时间。持续时间强制–因为它使用表示绝对毫秒/纳秒分频器的数字常数。

P.S。我已经使用恒定和复合分隔符运行基准测试,它们几乎没有差异,因此请随时使用更具可读性或更多语言限制的解决方案。