Go 的 time.Format 使用固定参考时间“2006-01-02 15:04:05”定义 layout,非占位符语法;传错格式如 "yyyy-MM-dd" 会 panic;layout 必须严格匹配参考时间各字段含义,空格及符号均敏感。

Go 的 time.Format 不是“填占位符”,而是用固定参考时间 "2006-01-02 15:04:05" 当模板;传 "yyyy-MM-dd" 或 "%Y-%m-%d" 会 panic,不是语法错误,是运行时崩溃。
time.Format 的 layout 字符串怎么写
layout 必须是 Go 参考时间 "Mon Jan 2 15:04:05 MST 2006" 的变形,每个数字对应一个含义:
-
2006→ 四位年份 -
01→ 补零两位月份(1表示不补零,但极少用) -
02→ 补零两位日期 -
15→ 24 小时制小时(03是 12 小时制) -
04→ 分钟 -
05→ 秒 -
-0700→ 时区偏移(推荐,比MST更明确)
常见错误:把 "2026-06-04" 当作 layout 直接套用——它只是示例值,不是格式符;真正要写的是 "2006-01-02"。
time.Parse 解析失败的典型原因
报错类似 parsing time "2026-06-04 05:04:00" as "Jan 2 2006 @ 15:04:05": cannot parse "2026-06-04",本质是 layout 和输入字符串结构不匹配:
立即学习“go语言免费学习笔记(深入)”;
- 输入是
"2026-06-04 05:04:00",layout 就得写"2006-01-02 15:04:05" - 输入带时区如
"+0800",layout 必须含-0700;输入是"UTC",layout 写"MST"但不推荐(歧义大) - 输入无时区,
time.Parse默认按 UTC 解析;要本地时区,改用time.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 即可:
func formatTime(t time.Time) string {
return t.Format("2006-01-02 15:04:05")
}
这种写法零开销、无错误风险;而 time.Parse("", t.String()) 不仅多一次字符串分配,还可能因 t.String() 格式不稳定(含纳秒、时区缩写等)导致解析失败。
最容易被忽略的一点:layout 中的空格、大小写、冒号、连字符全部敏感;"2006/01/02" 和 "2006-01-02" 是两个完全不同的 layout,不能混用。


















