Duration用秒+纳秒存储时长,getSeconds()返回整秒字段值,toSeconds()和toMillis()才分别返回总秒数(向下取整)和总毫秒数(四舍五入)。

Java 中 Duration 专门用于表示两个时间点之间的**时间量(时长)**,不绑定具体时刻。要获取秒数和毫秒数,关键在于理解它内部的存储结构和提供的方法。
用 getSeconds() 和 getNano() 组合计算总毫秒数
Duration 内部以「秒 + 纳秒」方式存储(纳秒部分范围是 0–999,999,999)。直接调用 getSeconds() 只返回整秒部分,不包含纳秒;而 toMillis() 才是真正换算后的总毫秒数(四舍五入到最接近的毫秒)。
如果你需要手动组合:
- 总毫秒数 = getSeconds() * 1000 + getNano() / 1_000_000(注意:纳秒除以 10⁶ 得毫秒,结果自动截断小数)
- 例如:
Duration.ofNanos(1_500_000_000)→getSeconds() == 1,getNano() == 500_000_000→ 毫秒 =1 * 1000 + 500=1500
推荐用 toSeconds() 和 toMillis() 直接获取
这两个方法更直观、安全,且已处理好精度和符号问题:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
立即学习“Java免费学习笔记(深入)”;
-
duration.toSeconds():返回完整的秒数(long 类型,向下取整,如 2.9 秒 → 2 秒) -
duration.toMillis():返回总毫秒数(long 类型,四舍五入到最近毫秒,如 1234.5ms → 1235ms) - 注意:它们都基于
getSeconds()和getNano()计算,但封装了逻辑,无需手动处理溢出或符号
别混淆 toSeconds() 和 getSeconds()
这是常见误区:
-
getSeconds()是「构成该 Duration 的整秒字段值」,不是总秒数。比如Duration.ofMinutes(2).plusSeconds(5),其getSeconds()返回5(不是 125),因为内部存的是seconds=5, nano=0,而分钟被转为 120 秒并加进seconds字段 —— 实际上getSeconds()返回的就是这个累加后的整秒值,但初学者容易误以为它只返回“额外加的秒” -
toSeconds()才是「等效的总秒数」,对上面例子返回125
实际计算示例(从两个 Instant 开始)
通常你先有起止时间,再构造 Duration:
Instant start = Instant.now(); // ... 执行一些操作 Instant end = Instant.now(); <p>Duration duration = Duration.between(start, end); long totalSeconds = duration.toSeconds(); // 总秒数(向下取整) long totalMillis = duration.toMillis(); // 总毫秒数(四舍五入) long nanos = duration.toNanos(); // 总纳秒数(精确,无舍入)</p>
如果只要毫秒级精度,toMillis() 最常用;若需更高精度或做纳秒级运算,用 toNanos() 更稳妥。

















