Java中如何基于时分值计算本地时间差返回小数形式时长
Java字符串时间差计算返回小数小时方案
问题场景
Java开发中进行时间差计算时,实体类内的departureTime(出发时间)、arriveTime(到达时间)字段均定义为string类型,调用自定义calculateDuration方法计算二者时间差时,仅能返回整数结果。
测试入参如下:
"departureTime": "9:00", "arriveTime": "11:30"
预期返回时长结果为2.5,当前方法实际返回整数2,不符合需求。
当前存在问题的代码片段:
private long calculateDuration() { final LocalDateTime departureDate = LocalDateTime.of(0, 1, 1, getHours(departureTime), getMinutes(departureTime)); final LocalDateTime arrivalDate = LocalDateTime.of(0, 1, 1, getHours(arriveTime), getMinutes(arriveTime)); return Duration.between(departureDate, arrivalDate).toHours(); } private int getHours(final String time) { return Integer.parseInt(time.split(":")[0]); } private int getMinutes(final String time) { return Integer.parseInt(time.split(":")[1]); }
问题根因
当前代码调用Duration.between().toHours()方法时,该方法会将时间差直接截断取整为小时单位,自动丢弃不足1小时的分钟/秒部分,因此2小时30分钟的差值会被截断返回2,丢失了30分钟对应的0.5小时部分。
同时方法返回值定义为long类型,本身也不支持返回小数结果。
修正方案
- 将方法返回值类型从
long修改为double,支持小数格式的时长返回 - 不直接使用
toHours()取整,改为先计算两个时间的总分钟数,除以60.0得到带小数的小时结果(注意除数必须写为60.0,如果写整数60会触发整数除法,依然返回整数结果)
修正后的完整代码:
// 返回值改为double类型支持小数 private double calculateDuration() { final LocalDateTime departureDate = LocalDateTime.of(0, 1, 1, getHours(departureTime), getMinutes(departureTime)); final LocalDateTime arrivalDate = LocalDateTime.of(0, 1, 1, getHours(arriveTime), getMinutes(arriveTime)); Duration timeDiff = Duration.between(departureDate, arrivalDate); // 总分钟数除以60.0,得到精确的小时差值 return timeDiff.toMinutes() / 60.0; } private int getHours(final String time) { return Integer.parseInt(time.split(":")[0]); } private int getMinutes(final String time) { return Integer.parseInt(time.split(":")[1]); }
以上代码传入9:00到11:30的参数时,总分钟差为150,150/60.0=2.5,完全符合预期结果。
如果需要支持秒级精度的时长计算,可以将计算逻辑替换为总秒数除以3600.0:
return timeDiff.toSeconds() / 3600.0;
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

