如何在Go语言中获取带毫秒精度的RFC 3339格式UTC时间字符串
Go语言获取带毫秒精度的UTC时间RFC3339格式字符串
问题分析
- 得到固定时间
2009-11-10T23:00:00Z是因为用了Go的默认零值时间(time.Time{}),而非当前系统时间。 - 虽然用了
Round(time.Millisecond)和time.RFC3339Nano,但如果时间本身没有毫秒级精度(比如零值时间),自然不会输出毫秒部分。
正确实现方法
要获取当前UTC时间并输出带毫秒的RFC3339格式,需要两步:
- 获取当前UTC时间:
time.Now().UTC() - 先按毫秒精度取整,再用
time.RFC3339Nano格式化,最后截断多余的纳秒位(因为RFC3339Nano会输出9位纳秒,我们只需要3位毫秒)
完整代码示例
package main import ( "fmt" "time" ) func main() { // 获取当前UTC时间,按毫秒取整 now := time.Now().UTC().Round(time.Millisecond) // 用RFC3339Nano格式化后,截取前23位(日期时间+3位毫秒)加Z timestamp := now.Format(time.RFC3339Nano)[:23] + "Z" fmt.Printf("\"timestamp\": \"%s\"\n", timestamp) }
代码说明
time.Now().UTC():获取当前系统时间的UTC时区版本,而非零值时间。Round(time.Millisecond):将时间精度截断到毫秒,避免纳秒部分干扰。- 格式化后截取前23位是因为
time.RFC3339Nano的格式是2006-01-02T15:04:05.999999999Z07:00,取前23位刚好到毫秒位,再加上Z就符合你要的2023-10-18T20:43:20.542Z格式。
失败原因说明
你之前的代码里使用的是time.Time{}(零值时间),它的时间值固定为2009-11-10T23:00:00Z,没有毫秒部分,所以即使调用Round和Format也不会生成毫秒位。只要替换成time.Now().UTC()就能解决问题。
内容的提问来源于stack exchange,提问作者sandeep kamath
相关产品推荐
相关产品推荐

