Duration不提供直接getHours(),但Java 9+可用toHoursPart()/toMinutesPart()/toSecondsPart()获取时分秒各部分(0–23/0–59/0–59),Java 8需用getSeconds()配合取模计算。

Java 中 Duration 本身不直接提供“时、分、秒”分离的 getter(比如没有 getHours()),但它可以精确表示两个时间点之间的**总毫秒数差值**,再通过其内置方法换算成小时、分钟、秒。关键在于:要用 Duration 的 基于秒和纳秒的拆解方式,而不是直接取总小时数(因为可能跨天,总小时会很大)。
用 toHoursPart() / toMinutesPart() / toSecondsPart()(推荐,Java 9+)
Java 9 引入了更直观的方法,能直接获取「去掉整小时后的剩余分钟」「去掉整小时整分钟后的剩余秒」:
-
toHoursPart():返回时、分、秒中「小时部分」(0–23) -
toMinutesPart():返回「分钟部分」(0–59) -
toSecondsPart():返回「秒部分」(0–59)
✅ 示例(计算 1 小时 23 分 45 秒的 Duration):
LocalDateTime start = LocalDateTime.of(2024, 1, 1, 10, 0, 0);
LocalDateTime end = LocalDateTime.of(2024, 1, 1, 11, 23, 45);
Duration d = Duration.between(start, end);
System.out.printf("%d:%02d:%02d",
d.toHoursPart(),
d.toMinutesPart(),
d.toSecondsPart());
// 输出:1:23:45
兼容 Java 8 的写法(手动拆解)
Java 8 没有上述 *Part 方法,需用 getSeconds() 和 getNano() 手动计算:
立即学习“Java免费学习笔记(深入)”;
-
d.getSeconds()返回总秒数(含小时、分钟折算后的秒),是 long 类型 -
d.getNano()返回纳秒部分(0–999,999,999),通常忽略或四舍五入到秒 - 用取模运算提取时分秒:小时 = 总秒 ÷ 3600,分钟 = (总秒 % 3600) ÷ 60,秒 = 总秒 % 60
✅ 示例(Java 8 兼容):
Duration d = Duration.between(start, end);
long totalSecs = d.getSeconds();
int hours = (int) (totalSecs / 3600);
int minutes = (int) ((totalSecs % 3600) / 60);
int seconds = (int) (totalSecs % 60);
System.out.printf("%d:%02d:%02d", hours, minutes, seconds);
// 同样输出:1:23:45
注意:Duration 不处理日期,只管“时间跨度”
Duration 是纯时间量(类似“25 小时”,不是“明天凌晨 1 点”)。它不关心年月日,所以:
- 如果两个
LocalDateTime相差超过 24 小时,toHoursPart()仍只返回 0–23 的余数(例如 25 小时 →toHoursPart()是 1) - 若你需要「总小时数」(如 25),就用
d.toHours();若需要「时:分:秒」格式显示(像计时器),才用 *Part 方法或手动取模 - 别对
ZonedDateTime或带时区的时间直接用Duration.between()——先转成同一时区的Instant更稳妥
小技巧:封装成工具方法
为避免重复写格式化逻辑,可封装一个静态方法:
public static String format(Duration d) {
long s = d.getSeconds();
int h = (int) (s / 3600);
int m = (int) ((s % 3600) / 60);
int sec = (int) (s % 60);
return String.format("%d:%02d:%02d", h, m, sec);
}
// 调用:format(Duration.between(a, b))


















