推荐使用java.time包的Instant和Duration计算时间差小时数:先将时间转为Instant,再用Duration.between().toHours()得整数小时;需小数结果时用toMinutes()/60.0。

Java 中计算两个时间之间的相差小时数,推荐使用 java.time 包(Java 8+),它简洁、线程安全且不易出错。核心思路是:将两个时间转为同一时区下的 ZonedDateTime 或 Instant,再用 Duration.between() 获取差值,最后调用 toHours() 得到整数小时数(向下取整)或 toHoursPart() 配合 toMinutes() 精确计算。
用 Instant 计算 UTC 时间差(推荐用于无时区业务)
如果两个时间都代表“绝对时刻”(比如数据库中的 TIMESTAMP WITH TIME ZONE),应先统一转为 Instant:
- 字符串时间需解析为
LocalDateTime+ 指定时区 → 转ZonedDateTime→ 调toInstant() - 直接使用
Instant.now()或Instant.ofEpochMilli()的也适用 -
Duration.between(instant1, instant2).toHours()返回的是完整小时数(截断小数,非四舍五入)
示例:
String time1 = "2024-05-01T10:30:00";String time2 = "2024-05-01T13:45:00";
ZoneId zone = ZoneId.systemDefault(); // 或 ZoneId.of("Asia/Shanghai")
LocalDateTime ldt1 = LocalDateTime.parse(time1);
LocalDateTime ldt2 = LocalDateTime.parse(time2);
Instant i1 = ldt1.atZone(zone).toInstant();
Instant i2 = ldt2.atZone(zone).toInstant();
long hours = Duration.between(i1, i2).toHours(); // 结果:3
保留分钟精度(获取带小数的小时数)
若需要 3.25 小时(即 3 小时 15 分钟)这样的结果,不能只用 toHours():
立即学习“Java免费学习笔记(深入)”;
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 用
Duration.toMinutes()获取总分钟数,再除以 60.0 得 double 类型小时数 - 注意:除法用
60.0(double)而非60(int),避免整除
示例续:
long totalMinutes = Duration.between(i1, i2).toMinutes();double hoursWithFraction = totalMinutes / 60.0; // 3.25
处理 LocalDate 或不带时分秒的时间
如果只有日期(如 LocalDate),默认按当天 00:00:00 计算,容易误判。务必确认业务含义:
- 想算“两个日期之间相隔多少自然日对应的小时”,可用
ChronoUnit.HOURS.between(ld1.atStartOfDay(), ld2.atStartOfDay()) - 但更常见的是:日期字段其实隐含“当日开始/结束”,需按业务补全时间(如 00:00 或 23:59)
兼容 Java 7 及以下(不推荐,仅作了解)
使用 Calendar 或 Date 需手动计算毫秒差,易受时区和夏令时影响:
long hours = diffInMillis / (1000 * 60 * 60); // 粗略整数小时(忽略时区偏移)
⚠️ 缺点明显:未考虑时区转换、无法处理夏令时跳变、不直观。除非受限于老环境,否则不用。

















