Go时间格式化必须用参考时间“2006-01-02 15:04:05 MST”变形作layout,不可用yyyy-MM-dd等占位符;Parse时layout需与输入字符串结构严格一致,空格大小写均敏感;推荐使用time.RFC3339等预定义常量。

Go 时间格式化不是填占位符,而是用固定参考时间当模板;直接套 yyyy-MM-dd 会 panic,必须用 "2006-01-02" 这类写法。
time.Format 的 layout 字符串怎么写
layout 不是任意字符串,它必须是 Go 参考时间 "Mon Jan 2 15:04:05 MST 2006" 的某种变形。每个字段对应一个含义:
-
2006→ 四位年份 -
01→ 两位月份(1表示不补零,01表示补零) -
02→ 两位日期(2同理) -
15→ 24 小时制小时(03是 12 小时制) -
04→ 分钟 -
05→ 秒 -
MST→ 时区缩写(但解析时慎用,推荐-0700)
常见错误:把 "%Y-%m-%d" 或 "yyyy-MM-dd" 当 layout 传给 Format,结果编译不报错、运行 panic。
time.Parse 解析失败的典型原因
你看到类似 parsing time "2025-04-05 10:30:00" as "Jan 2 2006 @ 15:04:05": cannot parse "2025-04-05" 的错误,根本原因是 layout 和输入字符串结构不匹配。
立即学习“go语言免费学习笔记(深入)”;
-
Parse的第一个参数是“输入字符串长什么样”,不是“我想输出成什么样” - 输入是
"2025-04-05 10:30:00",layout 就得写"2006-01-02 15:04:05" - 输入带时区如
"+0800",layout 必须含-0700;输入是"UTC",layout 得写"MST"(但不推荐,歧义大) - 若输入无时区,
Parse默认按 UTC 解析;要本地时区,改用ParseInLocation并传入time.Local
用预定义常量比手写 layout 更安全
标准库提供多个可靠常量,避免记错或漏字符:
-
time.RFC3339→"2006-01-02T15:04:05Z07:00"(API/日志首选) -
time.RFC3339Nano→ 带纳秒版本 -
time.UnixDate→"Mon Jan _2 15:04:05 MST 2006"(适合调试日志) -
time.Kitchen→"3:04PM"(美式口语时间)
注意:time.RFC3339 输出带实际偏移(如 +08:00),不是固定 Z;要强制 UTC + Z,得先调 t.UTC() 再 Format。
time.Time 已是对象时别再 Parse
如果函数参数已经是 time.Time 类型(比如从数据库查出来、HTTP 请求解码后),直接 Format 即可,完全不需要也不应该转成字符串再 Parse:
func formatTime(t time.Time) string {
return t.Format("2006-01-02 15:04:05")
}
这种写法零开销、无错误风险;而 time.Parse(..., t.String()) 不仅多一次字符串分配,还可能因 t.String() 格式不稳定(含纳秒、时区缩写等)导致解析失败。
最易被忽略的一点:layout 中空格、大小写、标点符号都必须严格一致;"2006-01-02T15:04:05" 和 "2006-01-02 T15:04:05" 是两个不同 layout,后者多一个空格就解析失败。


















