如何使用Go语言time包的Sub函数精确计算两个时间点之间的Duration差值?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1122个文字,预计阅读时间需要5分钟。
直接使用 `time.Sub()` 方法计算两个时间点之间的差值,但请注意确保两个 `time.Time` 值来自同一时区。否则,结果可能与预期的物理时间差不一致。
常见错误是拿本地时间(time.Now())和 UTC 时间(time.Now().UTC())直接相减,看似没问题,实则隐含时区偏移干扰 —— 比如在中国,time.Now().Sub(t.UTC()) 会多出 8 小时的 offset 抵消项。
- 始终用
t1.Sub(t2),别写成t2.Sub(t1)(符号反了) - 如果两个时间来自不同来源(比如数据库存的是 UTC,日志打的是本地时间),先统一用
.In(loc)转到同一*time.Location - 不要依赖
time.Now()的默认时区做跨服务时间对比,显式指定time.Now().In(time.UTC)
Duration 输出格式容易踩的坑
time.Duration 本质是纳秒整数,打印或比较时默认按“最简单位”显示(比如 5*time.Second 显示为 5s),但内部值不变;而 .Hours()、.Minutes() 这类方法返回的是浮点数,精度可能丢失。
本文共计1122个文字,预计阅读时间需要5分钟。
直接使用 `time.Sub()` 方法计算两个时间点之间的差值,但请注意确保两个 `time.Time` 值来自同一时区。否则,结果可能与预期的物理时间差不一致。
常见错误是拿本地时间(time.Now())和 UTC 时间(time.Now().UTC())直接相减,看似没问题,实则隐含时区偏移干扰 —— 比如在中国,time.Now().Sub(t.UTC()) 会多出 8 小时的 offset 抵消项。
- 始终用
t1.Sub(t2),别写成t2.Sub(t1)(符号反了) - 如果两个时间来自不同来源(比如数据库存的是 UTC,日志打的是本地时间),先统一用
.In(loc)转到同一*time.Location - 不要依赖
time.Now()的默认时区做跨服务时间对比,显式指定time.Now().In(time.UTC)
Duration 输出格式容易踩的坑
time.Duration 本质是纳秒整数,打印或比较时默认按“最简单位”显示(比如 5*time.Second 显示为 5s),但内部值不变;而 .Hours()、.Minutes() 这类方法返回的是浮点数,精度可能丢失。

