Duration.between()不能直接计算任意Temporal的秒/纳秒,需同类型(如Instant或LocalTime),返回Duration后用getSeconds()和getNano()拆分,toNanos()获取总纳秒数。

Java 中不能直接用 Duration.between() 计算任意两个 Temporal 之间的秒数和纳秒——因为 Duration.between() 要求两个参数必须是同类型且支持时间差计算的 Temporal(如都是 Instant、或都是 LocalTime),且它返回的是一个 Duration 对象,不是原始的秒/纳秒数值。
✅ 正确做法:先获取 Duration,再提取秒和纳秒
只要两个 Temporal 类型兼容(例如都是 Instant 或都是 LocalTime),就可以用 Duration.between(a, b) 得到持续时间,然后调用:
-
getSeconds()→ 返回总秒数(含符号,可能为负) -
getNano()→ 返回剩余纳秒部分(0–999,999,999),不包含秒内的纳秒
⚠️ 注意:getNano() 不是“总纳秒数”,而是 Duration 的纳秒字段,即 totalNanos % 1_000_000_000。要得到总纳秒数,应使用 toNanos()。
⏱️ 示例:Instant 之间计算秒和纳秒
这是最常见且安全的场景:
立即学习“Java免费学习笔记(深入)”;
Instant start = Instant.now(); // ... 执行操作 Instant end = Instant.now(); <p>Duration d = Duration.between(start, end); long seconds = d.getSeconds(); // 如 2 int nanos = d.getNano(); // 如 123456789(不是总纳秒!) long totalNanos = d.toNanos(); // 如 2_123456789
? LocalTime 之间也支持(仅时间,忽略日期)
适用于一天内的时间差:
LocalTime t1 = LocalTime.of(10, 0, 0, 123_000_000); LocalTime t2 = LocalTime.of(10, 0, 5, 456_000_000); <p>Duration d = Duration.between(t1, t2); long seconds = d.getSeconds(); // 5 int nanos = d.getNano(); // 333_000_000(456M - 123M)
注意:跨日会按 24 小时制循环(如 23:59:59 到 00:00:01 得到 2 秒)。
? 不支持的组合(会抛 DateTimeException)
以下调用会失败:
Duration.between(LocalDateTime.now(), Instant.now())Duration.between(LocalDate.now(), LocalTime.now())-
Duration.between(ZonedDateTime.now(), OffsetDateTime.now())(类型不同)
解决方法:统一转换为 Instant(需时区)或提取相同字段再算差值(如都转为毫秒时间戳)。
不复杂但容易忽略:getSeconds() 和 getNano() 是拆分值,toNanos() 才是完整纳秒精度的总值。


















