如何用Go time包生成无时区类RFC3339时间及带毫秒本地ISO8601时间?
关于Go语言time包时间格式化的两个问题解答
嘿,这两个问题其实都能通过Go time包内置的格式化能力优雅解决,不用自己手动拼接字符串,咱们一个个说清楚:
1. 格式化为类似RFC3339但无时区的本地时间
RFC3339的标准格式是 2006-01-02T15:04:05Z07:00,要去掉时区信息并保留本地时间,只需要自定义格式化字符串,删掉时区部分即可。
Go的时间格式化是基于参考时间 2006-01-02 15:04:05 MST 来匹配规则的,所以直接用下面的代码就能实现:
t := time.Now().Local() // 确保使用本地时区 formatted := t.Format("2006-01-02T15:04:05") fmt.Println(formatted) // 输出示例:2024-05-20T14:30:45
如果你习惯用空格代替T分隔日期和时间,把格式字符串改成"2006-01-02 15:04:05"就行。
2. 优雅获取带毫秒精度的ISO 8601本地时间字符串
你之前手动拼接的方式确实太繁琐了,其实Go的格式化字符串支持直接指定毫秒精度——参考时间里的毫秒部分是.000,所以直接在格式字符串里加上这个部分就搞定了:
t := time.Now().Local() msFormatted := t.Format("2006-01-02T15:04:05.000") fmt.Println(msFormatted) // 输出示例:2024-05-20T14:30:45.123
同样,如果偏好空格分隔,格式字符串换成"2006-01-02 15:04:05.000"就好。这个方法完全利用了time包的内置能力,比手动计算秒和毫秒要简洁、可靠得多。
内容的提问来源于stack exchange,提问作者Escher




