time.now().unix() 是最直接的秒级时间戳获取方式,返回自 unix 纪元起的整秒数(int64),utc 时区、零拷贝、跨语言通用;毫秒/微秒需组合 unix() 和 nanosecond() 计算,还原 time.time 时须显式指定 utc 时区。

time.Now().Unix() 是最直接的秒级时间戳获取方式
Go 标准库 time.Now() 返回的是 time.Time 类型,调用其 Unix() 方法即可得到自 Unix 纪元(1970-01-01 00:00:00 UTC)起经过的**整秒数**,返回类型为 int64。
这是绝大多数场景(如日志打点、缓存过期、API 时间参数)真正需要的“时间戳”——简洁、可比较、跨语言通用。
- 秒级精度已足够应对大多数业务逻辑,且避免浮点或字符串解析开销
-
Unix()是零拷贝操作,性能极高;无需额外格式化或转换 - 注意:它返回的是 UTC 时间对应的秒数,与本地时区无关 —— 这是正确行为,不是 bug
毫秒/微秒/纳秒时间戳需手动计算,别直接用 UnixNano() 除法
UnixNano() 返回纳秒数,但直接用 UnixNano() / 1e6 得到毫秒值,在极端高并发下可能因整数除法截断导致重复(尤其当多个 goroutine 在同一纳秒内调用时)。更稳妥的做法是组合使用 Unix() 和 Nanosecond():
now := time.Now() ms := now.Unix()*1000 + int64(now.Nanosecond())/1e6
这样能确保毫秒值严格单调递增(只要系统时钟不回拨)。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
UnixMilli()在 Go 1.17+ 才可用;若项目兼容旧版本,不要依赖它 -
UnixNano()值极大(约 1.6e18),做除法易引入隐式类型转换风险,建议显式转int64 - 微秒同理:用
Unix()*1e6 + int64(Nanosecond())/1e3,而非UnixNano()/1e3
从时间戳还原 time.Time 时必须指定时区,否则默认为本地时区
用 time.Unix(sec, nsec) 构造 time.Time 时,Go 默认将其解释为**本地时区时间**,而非 UTC。这会导致解析后的时间对象与原始含义错位(例如存的是 UTC 时间戳,却按本地时区解析)。
正确做法是显式指定 UTC 时区:
ts := int64(1717027200) // 某个 UTC 秒级时间戳 t := time.Unix(ts, 0).UTC() // ✅ 强制设为 UTC // 或更明确: t := time.Unix(ts, 0).In(time.UTC)
- 如果后续要格式化输出(如
t.Format("2006-01-02 15:04:05")),时区影响结果;不设 UTC 可能导致时差混淆 -
time.Unix()本身不存储时区信息,.UTC()是视图转换,不改变底层纳秒计数 - 数据库或 API 接收的时间戳通常约定为 UTC,还原时务必对齐
time.Now() 不是线程安全的“全局时钟”,高精度场景需注意系统调用开销
time.Now() 底层触发系统调用(如 clock_gettime(CLOCK_REALTIME, ...)),在热点路径中高频调用(如每毫秒多次)会成为性能瓶颈。
- 若只需相对时间差,优先用
time.Since(start)或time.Now().Sub(start),它们复用同一时刻快照 - 对一致性要求极高的分布式场景(如生成唯一有序 ID),不要只依赖
time.Now(),需结合原子计数器或逻辑时钟 - 测试中若 mock 时间,应通过接口注入
func() time.Time,而非直接调用time.Now
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










