如何在Go语言中获取Unix时间(毫秒)?我有以下功能:
func makeTimestamp() int64 { return time.Now().UnixNano() % 1e6 / 1e3 }
我需要更少的精度,只需要毫秒。
gudnpqoy1#
从go v1.17开始,time包增加了UnixMicro()和UnixMilli(),所以正确答案是:time.Now().UnixMilli()
time
UnixMicro()
UnixMilli()
time.Now().UnixMilli()
把它分开:
func makeTimestamp() int64 { return time.Now().UnixNano() / 1e6 }
1e6,即1 000 000是一毫秒中的纳秒数。下面是一个示例,您可以编译并运行它来查看输出
1e6
package main import ( "time" "fmt" ) func main() { a := makeTimestamp() fmt.Printf("%d \n", a) } func makeTimestamp() int64 { return time.Now().UnixNano() / 1e6 }
cgh8pdjw2#
保持简单。
func NowAsUnixMilli() int64 { return time.Now().UnixNano() / 1e6 }
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的答案应该会很好地工作。
time.Nanosecond
1
time.Now().UnixNano()
time.Millisecond
8ulbf1ek4#
如何在Go语言中获取Unix时间(毫秒)?
不再有纳秒的除法。从Go 1.17开始,你可以直接使用Time.UnixMilli方法:
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
xe55xuns5#
在https://github.com/golang/go/issues/44196 randall77建议
time.Now().Sub(time.Unix(0,0)).Milliseconds()
它利用了Go语言的time.Duration已经有Milliseconds方法的事实。
time.Duration
Milliseconds
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
avkwfej47#
简单但精确的解决方案是:
func nowAsUnixMilliseconds(){ return time.Now().Round(time.Millisecond).UnixNano() / 1e6 }
此功能:1.正确地将值四舍五入到最接近的毫秒(与整数除法比较:它只是丢弃结果值的小数部分);1.不深入到Go-具体的时间。持续时间强制转换-因为它使用一个数字常量来表示绝对毫秒/纳秒分频器。P.S.我用常量和复合分频器运行过基准测试,它们几乎没有什么区别,所以请随意使用更具可读性或更严格的语言解决方案。
7条答案
按热度按时间gudnpqoy1#
2021答案:
从go v1.17开始,
time
包增加了UnixMicro()
和UnixMilli()
,所以正确答案是:time.Now().UnixMilli()
对于go v.1.16及更早版本:
把它分开:
1e6
,即1 000 000是一毫秒中的纳秒数。下面是一个示例,您可以编译并运行它来查看输出
cgh8pdjw2#
保持简单。
qnakjoqk3#
正如@Jono在@OneOfOne的回答中指出的那样,正确的答案应该考虑纳秒的持续时间。例如:
OneOfOne的答案是有效的,因为
time.Nanosecond
恰好是1
,除以1没有效果。我不知道足够的去知道这是有多大可能在未来改变,但对于严格正确的答案,我会使用这个函数,而不是OneOfOne的答案。我怀疑有任何性能缺点,因为编译器应该能够很好地优化它。参见https://en.wikipedia.org/wiki/Dimensional_analysis
另一种方法是
time.Now().UnixNano()
和time.Millisecond
使用相同的单位(纳秒)。只要这是真的,OneOfOne的答案应该会很好地工作。8ulbf1ek4#
如何在Go语言中获取Unix时间(毫秒)?
Go 1.17及以上
不再有纳秒的除法。从Go 1.17开始,你可以直接使用
Time.UnixMilli
方法:Playground:https://play.golang.org/p/JSExv5jw2ZW
xe55xuns5#
在https://github.com/golang/go/issues/44196 randall77建议
它利用了Go语言的
time.Duration
已经有Milliseconds
方法的事实。gt0wga4j6#
我认为最好在除法之前将时间四舍五入到毫秒。
下面是一个示例程序:
上面的程序在我的机器上打印了下面的结果:
avkwfej47#
简单但精确的解决方案是:
此功能:
1.正确地将值四舍五入到最接近的毫秒(与整数除法比较:它只是丢弃结果值的小数部分);
1.不深入到Go-具体的时间。持续时间强制转换-因为它使用一个数字常量来表示绝对毫秒/纳秒分频器。
P.S.我用常量和复合分频器运行过基准测试,它们几乎没有什么区别,所以请随意使用更具可读性或更严格的语言解决方案。