
本文介绍如何使用 Go 标准库 time.Format() 方法,以简洁、可靠的方式将时间格式化为固定长度的字符串(如 YYYYMMDD_HH),避免手动拼接和补零错误。
本文介绍如何使用 go 标准库 `time.format()` 方法,以简洁、可靠的方式将时间格式化为固定长度的字符串(如 `yyyymmdd_hh`),避免手动拼接和补零错误。
Go 语言的时间格式化不采用常见的 strftime 风格(如 %Y-%m-%d),而是基于一个固定参考时间:Mon Jan 2 15:04:05 MST 2006(即 Unix 时间戳 1136239445)。该时间被设计为包含所有时间单位的典型值,每个数字位置对应特定含义:
- 2006 → 年(4 位)
- 01 → 月(2 位,带前导零)
- 02 → 日(2 位)
- 15 → 小时(24 小时制,2 位)
- 04 → 分钟
- 05 → 秒
因此,要生成形如 20160603_09 的字符串(即 YYYYMMDD_HH,月、日、小时均补零至两位),应使用格式字符串 "20060102_15":
package main
import (
"fmt"
"time"
)
func main() {
t := time.Date(2016, 6, 3, 9, 0, 0, 0, time.UTC)
formatted := t.Format("20060102_15")
fmt.Println(formatted) // 输出:20160603_09
t2 := time.Date(2016, 10, 30, 14, 0, 0, 0, time.UTC)
fmt.Println(t2.Format("20060102_15")) // 输出:20161030_14
}✅ 优势说明:
- 无需手动转换与补零:Format() 自动处理 6 → "06"、3 → "03"、9 → "09" 等逻辑;
- 线程安全且高效:底层优化,远优于多次 strconv.Itoa + strings.Join;
- 可读性强:格式字符串直观对应输出结构,便于维护;
- 符合 Go 惯例:是标准、推荐的时间序列化方式。
⚠️ 注意事项:
- 格式字符串中 15 表示 24 小时制的小时(00–23),若需 12 小时制请用 3(无前导零)或 03(有前导零);
- _ 在格式串中是字面量下划线,非特殊符号,可自由放置(如 "20060102_HH" 中的 _ 即原样输出);
- 所有数字占位符均自动补零——01、02、15 等均隐含“最小宽度为 2 且左补零”语义。
总结:与其手动拆解 time.Time 并逐字段转换,不如直接使用 t.Format("20060102_15")。它更简洁、更健壮、更地道,是 Go 时间格式化的最佳实践。

















