Duration 的 toDays()、toHours() 等方法返回总时长向下取整后的等效单位值,而非逐级换算的剩余部分;例如 toDays() 返回 totalSeconds / 86400 向下取整,toHours() 返回 totalSeconds / 3600 向下取整,依此类推;如需“X天Y小时Z分钟”格式,应使用 Java 9+ 的 toDaysPart() 等方法或手动模运算。

Java 中 Duration 的 toDays()、toHours()、toMinutes()、toMillis() 等方法返回的是**总时间长度的等效数值(截断取整)**,不是按天/小时/分钟逐级换算后的“剩余部分”,而是直接将整个时长换算成对应单位的**向下取整值**。
toDays():获取总天数(向下取整)
返回该 Duration 对应的完整天数,即 totalSeconds / 86400 向下取整(忽略不足一天的部分)。
-
Duration.ofDays(2).toDays()→ 2 -
Duration.ofHours(48).toDays()→ 2 -
Duration.ofHours(50).toDays()→ 2(50 小时 = 2 天 2 小时,只取整数天) -
Duration.ofSeconds(172800).toDays()→ 2(172800 秒 = 2 天)
toHours():获取总小时数(向下取整)
返回总小时数,即 totalSeconds / 3600 向下取整。
-
Duration.ofHours(5).toHours()→ 5 -
Duration.ofMinutes(181).toHours()→ 3(181 分钟 = 3 小时 1 分钟) -
Duration.ofDays(1).plusHours(2).toHours()→ 26(24 + 2)
toMinutes() 和 toMillis():同理,取整换算
它们分别将整个 Duration 换算为总分钟数、总毫秒数,全部向下取整(对分钟和毫秒来说,由于精度足够高,通常无精度损失)。
立即学习“Java免费学习笔记(深入)”;
-
Duration.ofMinutes(5).plusSeconds(59).toMinutes()→ 5(5 分 59 秒 → 5 分钟) -
Duration.ofSeconds(1).toMillis()→ 1000 -
Duration.ofNanos(1_500_000).toMillis()→ 1(1.5 毫秒 → 截断为 1 毫秒)
注意:这些方法不分解时间,也不保留余数
如果你需要“X 天 Y 小时 Z 分钟”的格式化输出,不能只靠 toDays() + toHours() 组合——因为 toHours() 返回的是总小时数,不是“去掉天数后的剩余小时”。正确做法是用 toDaysPart()、toHoursPart() 等(Java 9+)或手动计算:
- Java 9+ 推荐:
d.toDays(),d.toHoursPart(),d.toMinutesPart(),d.toSecondsPart() - 兼容旧版:先算总秒数
d.getSeconds(),再用模运算逐级提取(注意处理负数)


















