Go 14.4版本时间转2006-01-02T15:04:05Z格式异常如何修复
Go时间转换异常修复方案
问题根因
- 调用
time.Now().Format(time.RFC3339)输出的字符串,当运行环境时区不是UTC时,末尾会携带时区偏移(例如东八区输出格式为2024-05-20T12:00:00+08:00),而你写的解析模板2006-01-02T15:04:05Z仅能匹配末尾带Z标识的UTC时间字符串,格式不匹配导致Parse调用失败。 - 你忽略了
Parse的错误返回值,解析失败后会返回time.Time类型的零值,也就是你看到的0001-01-01 00:00:00 +0000 UTC。 - Go Playground的
time.Now()固定返回2009-11-10 23:00:00 +0000 UTC,时区为UTC,所以格式化后末尾带Z,刚好匹配你的解析模板,因此能正常返回对应时间。
修复方案
方案1:直接生成符合要求的UTC格式时间
如果你最终要的就是2006-01-02T15:04:05Z格式的UTC时间,无需先格式化再解析,直接按模板格式化即可:
// 直接生成目标格式字符串 timeStr := time.Now().UTC().Format("2006-01-02T15:04:05Z") // 如果需要time类型,直接保留UTC时间对象即可,不需要来回转换 currentDateTime := time.Now().UTC()
方案2:使用兼容全RFC3339格式的模板解析
如果你确实需要先格式化再解析,直接用Go内置的time.RFC3339作为解析模板,兼容带Z和带时区偏移的所有RFC3339格式字符串:
currentTime := time.Now().Format(time.RFC3339) // 不要忽略错误返回值 currentDateTime, err := time.Parse(time.RFC3339, currentTime) if err != nil { // 自定义错误处理逻辑 panic(err) }
注意事项
所有可能返回错误的Go标准库方法都不要忽略错误返回值,解析失败的错误会直接提示格式不匹配的问题,能大幅降低排查成本。
内容的提问来源于stack exchange,提问作者supriya
相关产品推荐
相关产品推荐

