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

1zmg4dgp  于 2023-06-19  发布在  Go
关注(0)|答案(7)|浏览(425)

如何在Go语言中获取Unix时间(毫秒)?
我有以下功能:

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

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

gudnpqoy

gudnpqoy1#

2021答案:

从go v1.17开始,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
}
cgh8pdjw

cgh8pdjw2#

保持简单。

func NowAsUnixMilli() int64 {
    return time.Now().UnixNano() / 1e6
}
qnakjoqk

qnakjoqk3#

正如@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的答案应该会很好地工作。

8ulbf1ek

8ulbf1ek4#

如何在Go语言中获取Unix时间(毫秒)?

Go 1.17及以上

不再有纳秒的除法。从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

xe55xuns

xe55xuns5#

https://github.com/golang/go/issues/44196 randall77建议

time.Now().Sub(time.Unix(0,0)).Milliseconds()

它利用了Go语言的time.Duration已经有Milliseconds方法的事实。

gt0wga4j

gt0wga4j6#

我认为最好在除法之前将时间四舍五入到毫秒。

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
avkwfej4

avkwfej47#

简单但精确的解决方案是:

func nowAsUnixMilliseconds(){
    return time.Now().Round(time.Millisecond).UnixNano() / 1e6
}

此功能:
1.正确地将值四舍五入到最接近的毫秒(与整数除法比较:它只是丢弃结果值的小数部分);
1.不深入到Go-具体的时间。持续时间强制转换-因为它使用一个数字常量来表示绝对毫秒/纳秒分频器。
P.S.我用常量和复合分频器运行过基准测试,它们几乎没有什么区别,所以请随意使用更具可读性或更严格的语言解决方案。

相关问题