time.format() 不支持国际化,仅输出英文日期;需用 golang.org/x/text/message 实现多语言渲染,而中文日期解析须预处理转为标准格式再 parse。

time.Format() 本身不支持国际化,别指望它输出“四月”或“星期二”
Go 标准库的 time.Format() 只认固定参考时间 "Mon Jan 2 15:04:05 MST 2006" 的字段映射,所有月份名、星期名、AM/PM 都是硬编码英文。传入 "2006年1月2日" 这种字符串,它不会把 1月 替换成当前语言的“一月”,而是原样输出字面量——所以 t.Format("2006年1月2日") 永远是“2026年1月2日”,不是“2026年七月十四日”。
想让 t.Month() 返回中文“七月”,得自己建 map[time.Month]map[string]string 查表;想让 t.Weekday() 显示“星期二”,也得手动映射。这不是 bug,是设计限制。
真要显示本地化日期,必须用 golang.org/x/text/message
标准库做不到的事,golang.org/x/text/message 能做:自动按语言规则渲染年月日、星期、序数词(如“4th”→“4日”),还支持时区感知和数字格式。安装:go get golang.org/x/text@latest。
关键点:
-
message.NewPrinter(language.Chinese)创建中文打印机,p.Printf("%v", t)就能输出“2026年7月14日星期二” -
message.NewPrinter(language.English)对应输出 “Tuesday, July 14, 2026” - 不改
time.Time值本身,只控制渲染逻辑;%v是触发本地化格式化的关键,不用写具体 layout - 不支持解析用户输入的中文日期(如“七月十四日”),
time.Parse()完全不认识中文月份名
解析含中文/多语言日期字符串时,必须预处理
如果用户提交的是“七月十四日 18:44”这类输入,time.Parse() 直接 panic。你得先做字符串清洗:
- 用查表或正则把“七月”→“7”,“十四日”→“14”,“星期二”→“Tuesday”
- 注意边界:“12:00 AM” → “00:00”,“12:00 PM” → “12:00”,不能简单 +12
- 大小写、标点、空格都要归一化,比如“p.m.”、“P M”、“ 7 : 14 ”都得统一成可 parse 的格式
- 推荐用
fmt24库处理 AM/PM 转换,它已覆盖常见歧义写法,比手写正则更稳
Layout 字符串写错一位就 panic,别套其他语言习惯
time.Parse() 和 time.Format() 的 layout 不是模板语法,而是参考时间的“镜像”。写成 "yyyy-MM-dd" 或 "%Y-%m-%d" 会直接报错:parsing time "2026-07-14" as "yyyy-MM-dd": cannot parse "yyyy" as "yyyy"。
必须严格匹配:
- “2026-07-14” → layout 是
"2006-01-02"(年份用 2006,月日用 01/02) - “2026/07/14 18:44:00” → layout 是
"2006/01/02 15:04:05"(小时是 24 小时制的 15,不是 03) - 带时区如
"2026-07-14T18:44:00+08:00"→ layout 必须是"2006-01-02T15:04:05Z07:00"(注意 Z 和 07:00 的位置) - 哪怕多一个空格、少一个冒号,都会导致
time.Parse()返回 error
真正麻烦的不是怎么写 layout,而是当你要同时支持中/英/日多语言显示 + 解析用户自由输入时,format 和 parse 两条路得各自独立处理,没法共用一套逻辑。本地化渲染靠 message.Printer,自由文本解析靠预处理 + 查表 + 容错库,两者之间没有捷径。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











