下面这些 Go 示例以 Unix 秒作为通用基准,只有在运行时天然提供毫秒的地方才展示毫秒。复制之前先回答一个简单的问题:下游那个 API 要的是什么单位?
获取当前 Unix 时间
seconds := time.Now().Unix()
milliseconds := time.Now().UnixMilli()
把时间戳转成 UTC
t := time.Unix(1700000000, 0).UTC()
fmt.Println(t.Format(time.RFC3339))
上生产前留意
time.Time 表示的是一个瞬间。给人看之前,请有意识地调 UTC 或加载一个具名 location,再做格式化。
值跨越系统边界时,把单位写进字段名里:createdAtSeconds 和 createdAtMs 是比 createdAt 长了点,但出事故的时候能省下不少猜测。
Frequent questions:
- Q: 该存 time.Time 还是 Unix 秒?
- A: 在 Go 代码内部需要做日历运算时用 time.Time;而当这个值要被索引、查询或者传给其他系统时,存 Unix 秒或数据库的时间戳类型。
- Q: time.Unix 期望什么单位?
- A: time.Unix 接收秒和纳秒两个独立参数。如果你拿到的是毫秒,先拆分或换算再调用。
- Q: 怎么验证 Go 的输出?
- A: 用 t.UTC().Format(time.RFC3339) 格式化,再和目标 API、消息队列或数据库列所期望的时间戳对照一下。