
Go 的 time.Parse 要求格式字符串必须基于固定参考时间 “2006-01-02 15:04:05”,而非任意日期;解析 “2017/02/28 17:07:54” 时,需将分隔符和字段顺序严格映射为 "2006/01/02 15:04:05",否则返回零值时间。
go 的 time.parse 要求格式字符串必须基于固定参考时间 “2006-01-02 15:04:05”,而非任意日期;解析 “2017/02/28 17:07:54” 时,需将分隔符和字段顺序严格映射为 `"2006/01/02 15:04:05"`,否则返回零值时间。
在 Go 中,time.Parse 不接受常见的 ISO 或自定义占位符(如 %Y/%m/%d),而是采用唯一且固定的参考时间:Mon Jan 2 15:04:05 MST 2006 —— 这是 Go 的诞生时间(2006 年 1 月 2 日下午 3 点 4 分 5 秒)。其字符串表示 "2006/01/02 15:04:05" 即为对应布局(layout)模板,每个数字位置具有唯一语义:
-
2006→ 四位年份 -
01→ 两位月份(1–12) -
02→ 两位日期(1–31) -
15→ 24 小时制小时(0–23) -
04→ 分钟(0–59) -
05→ 秒(0–59)
⚠️ 注意:01 和 02 不可互换,也不代表“任意两位数”;它们是硬编码的标识符。若误写为 "2017/02/28 17:07:54" 作为 layout,Go 会尝试将字面值 2017 当作年份常量匹配,导致解析失败并返回零时间 0001-01-01 00:00:00 +0000 UTC。
✅ 正确做法是定义与输入格式结构一致、但值为参考时间的 layout 字符串:
package main
import (
"fmt"
"time"
)
func main() {
input := "2017/02/28 17:07:54"
const layout = "2006/01/02 15:04:05" // ✅ 匹配输入结构:年/月/日 时:分:秒
t, err := time.Parse(layout, input)
if err != nil {
panic(err)
}
// 输出目标格式 "Feb 28"
formatted := t.Format("Jan 02")
fmt.Println(formatted) // 输出:Feb 28
}
? 小技巧:t.Format("Jan 02") 中:
-
"Jan"表示三位英文缩写月份(Jan,Feb, …Dec) -
"02"表示带前导零的日期(01,02, …31)
这正是题目要求的"Feb 28"格式(非"February 28")。
? 总结:
- Layout 字符串不是占位符模板,而是参考时间的字面格式快照;
- 必须严格保持字段顺序、分隔符(
/,`,:`)与输入字符串完全一致; - 常用 layout 可提前定义为常量,提高可读性与复用性;
- 解析失败时务必检查
err,零时间通常是 layout 错误的明确信号。










