go中秒级时间戳转字符串需用time.unix(sec,0)和固定布局"2006-01-02 15:04:05",参数类型、纳秒位、时区(utc需显式调用.utc())及格式串位置均不可错,否则结果错误。

Go 里用 time.Unix() 转秒级时间戳,再调 Format() 输出字符串——但格式化字符串不是 ISO 或 Python 那套,必须用 Go 的“魔数”布局("2006-01-02 15:04:05"),写错一个数字位置,结果就全乱。
秒级时间戳转 time.Time:别传错参数类型
Go 的 time.Unix() 接收两个 int64 参数:sec 和 nsec。秒级时间戳只用填第一个,第二个必须显式传 0,否则会把你的秒数误当纳秒处理,得到完全错误的时间。
- ✅ 正确:
time.Unix(1717027200, 0) - ❌ 错误:
time.Unix(1717027200, nil)(编译不过)、time.Unix(1717027200, 1)(加了 1 纳秒,不关键但语义错) - ⚠️ 注意:
time.Unix()返回的是本地时区时间;如需 UTC,得链式调用.UTC()
Format() 的格式串不是占位符,是固定布局模板
Go 不用 %Y-%m-%d 这类 C 风格,而是用一个真实日期(2006 年 1 月 2 日下午 3 点 04 分 05 秒)作为参考模板——因为那天是 Go 发布日。每个字段位置严格对应,挪动就会错位。
-
"2006-01-02"→ 年-月-日(不能写成"%Y-%m-%d",那会原样输出) -
"15:04:05"→ 24 小时制时:分:秒("3:04:05 PM"才是 12 小时制) -
"2006-01-02T15:04:05Z0700"→ 带时区偏移的 RFC3339 格式(注意Z0700表示 +0800 类偏移) - 空格、横线、冒号都算在模板里,多一个少一个字符,
Format()就照抄,不会自动补或删
常见格式需求与对应 Format 字符串
实际开发中高频用到的几种格式,直接复制粘贴可用(注意时区影响):
- 标准 API 时间(RFC3339):
"2006-01-02T15:04:05Z0700"(推荐用于 HTTP header 或 JSON 序列化) - 数据库常用格式:
"2006-01-02 15:04:05"(MySQL 默认 datetime 格式) - 中文可读格式:
"2006年01月02日 15:04:05"(纯字符串拼接,Go 不内置 locale 支持) - 精确到毫秒:
"2006-01-02 15:04:05.000"(需先用UnixMilli()或Format()结合time.Nanosecond计算)
时区问题最容易被忽略
time.Time 内部存的是 UTC 时间,但 Format() 默认按本地时区渲染。同一时间戳,在北京和纽约机器上跑,Format("2006-01-02 15:04:05") 输出不同。
- 要强制 UTC 输出:先
t.UTC().Format(...) - 要指定其他时区(如上海):
t.In(time.LoadLocation("Asia/Shanghai")).Format(...) - 没显式指定时区的字符串(如
"2024-05-30 12:00:00")被time.Parse()解析时,默认按本地时区解释,极易出错
真正麻烦的不是转换本身,而是你不知道自己正在用哪个时区——尤其跨服务传递时间字符串时,漏掉时区标识(Z 或 +0800)几乎必然导致时间错 8 小时。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











