如何使用Go语言time包的Sub函数精确计算两个时间点之间的Duration差值?

2026-05-07 15:250阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1122个文字,预计阅读时间需要5分钟。

如何使用Go语言time包的Sub函数精确计算两个时间点之间的Duration差值?

直接使用 `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分钟。

如何使用Go语言time包的Sub函数精确计算两个时间点之间的Duration差值?

直接使用 `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() 这类方法返回的是浮点数,精度可能丢失。

阅读全文