Duration.between() 不支持跨天计算 LocalTime 间隔,但同天内可纳秒精度计算;跨天需手动加24小时修正,其结果本质是纳秒偏移量之差,天然支持纳秒级精度。

Duration.between() 本身**不支持直接计算两个 LocalTime 对象之间精确到纳秒的时间间隔**,因为 LocalTime 表示的是“一天中的时刻”,没有日期信息,而 Duration.between() 在处理 LocalTime 时会将其视为同一天内的两个时间点,并返回一个基于 24 小时制的 Duration —— 它的精度确实是纳秒级,但**逻辑上只反映同一天内的时间差**(例如从 10:00:00.000000000 到 15:30:45.123456789),无法表达跨天(如 23:59:59 到次日 00:00:01)的“自然经过时间”,除非你显式约定比较逻辑。
不过,只要明确前提(比如默认在同一天内比较,或手动处理跨天情况),Duration.between() 返回的 Duration 对象**天然支持纳秒精度**。下面分几种常见场景说明:
✅ 同一天内比较:直接使用 Duration.between() 即可获得纳秒精度
LocalTime 内部以纳秒为单位存储(从 00:00 到 23:59:59.999999999 共 86_400_000_000_000 纳秒),所以 Duration.between(t1, t2) 的结果自动保留全部纳秒信息。
- 它返回的是
t2.minusNanos(t1.toNanoOfDay())的等效值,本质是两个纳秒偏移量之差 - 结果可能为负(若
t2 < t1),可用abs()取绝对值 - 可通过
.toNanos()获取总纳秒数(long类型),或用.getNano()+.getSeconds()分离秒和纳秒部分
⚠️ 跨天场景:Duration.between() 默认不跨天,需手动处理
例如 LocalTime.of(23, 59, 59, 999_999_999) 和 LocalTime.of(0, 0, 0, 1),直接调用 between() 会得到负值(约 -863999999999998 ns),而非你期望的 +2 ns。
若业务逻辑需要“下一个最近时刻”的经过时间(即允许跨天),可这样处理:
- 先计算同天差值
d = Duration.between(t1, t2) - 若
d.isNegative(),则加上 24 小时:d.plus(Duration.ofDays(1)) - 这样得到的就是最小正向经过时间(含纳秒)
? 验证纳秒精度的小例子
以下代码能清晰看到纳秒级差异:
LocalTime t1 = LocalTime.of(10, 0, 0, 123456789); // 10:00:00.123456789 LocalTime t2 = LocalTime.of(10, 0, 5, 987654321); // 10:00:05.987654321 Duration d = Duration.between(t1, t2); System.out.println(d); // PT5.864197532S (5秒 + 864197532纳秒) System.out.println(d.toNanos()); // 5864197532 System.out.println(d.getSeconds()); // 5 System.out.println(d.getNano()); // 864197532
? 注意事项
-
Duration.between()接收的是Temporal,LocalTime实现了它,所以编译通过;但它不适用于需要日期上下文的场景(如时区、夏令时、日历变更) - 不要用
ChronoUnit.NANOS.between(t1, t2)—— 它对LocalTime抛UnsupportedTemporalTypeException - 如果需要更高层级语义(如“从现在到明天 9 点”),应改用
LocalDateTime或ZonedDateTime

















