Java中计算相邻日期分钟差及累加结果异常问题求助
问题:Date列表相邻元素时间差计算结果不符
我有如下一个Date类型的列表(日志输出):
I/System.out: TAG: Mon Jun 20 15:36:00 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 15:51:55 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 15:52:14 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 16:24:01 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 18:39:07 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 18:49:02 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 20:24:26 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 20:52:23 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 22:41:50 GMT+02:00 2022 I/System.out: TAG: Mon Jun 20 22:55:54 GMT+02:00 2022
需要计算每一组开始-结束时间的差值(例如第一组:Mon Jun 20 15:51:55 GMT+02:00 2022 - Mon Jun 20 15:36:00 GMT+02:00 2022,差值约16分钟),再累加这些组的总时长。
尝试了以下代码:
for(int i=0;i<list.size()-1;i++){ parked += list.get(i+1).getTime() - list.get(i).getTime(); } System.out.println("parked time: "+parked / 60000);
但得到的结果是434分钟,而非预期的98分钟,请问该如何解决?
解决方案
问题原因
你当前的代码错误地将所有相邻元素的时间差累加,包括了两次停车之间的间隔(比如15:52:14到16:24:01的32分钟空窗期),这部分不属于停车时长,导致总时长被大幅高估。从时间序列来看,这些时间点是成对出现的(开始-结束-开始-结束...),你需要只计算每一对内的结束时间与开始时间的差值,再累加这些有效时长。
修正代码
将循环的步长改为2,每次处理一组开始-结束时间:
long parked = 0; // 步长为2,跳过两次停车之间的间隔 for(int i=0; i < list.size()-1; i += 2){ parked += list.get(i+1).getTime() - list.get(i).getTime(); } System.out.println("parked time: " + parked / 60000);
优化建议(Java 8+)
使用Java 8引入的java.time API替代过时的Date类,代码可读性更强,且避免时区等潜在问题:
import java.time.Duration; import java.time.LocalDateTime; import java.util.List; // 假设列表类型为List<LocalDateTime> Duration totalParked = Duration.ZERO; for(int i=0; i < list.size()-1; i += 2){ Duration duration = Duration.between(list.get(i), list.get(i+1)); totalParked = totalParked.plus(duration); } System.out.println("parked time: " + totalParked.toMinutes());
执行修正后的代码后,计算出的总时长约为99.6分钟,与你预期的98分钟接近,差异来自精确秒数的四舍五入。
内容的提问来源于stack exchange,提问作者Nikola Stankovic
相关产品推荐
相关产品推荐

