工作中遇到这个需求,自己写了一下,测试了几种情况都没有问题。
这里的时间段我是用的map存储的,map里面是一个key为st的开始时间,一个key为et的结束时间。
/** * 计算多个时间段中的重复时间 * * @param seTimes 按时间段的开始时间排好序的时间段集合 */ public static int calcRepetition(List<Map<String, Date>> seTimes) { if (CollUtil.isEmpty(seTimes)) { return 0; } //按开始时间排序 seTimes = seTimes.stream().peek(m -> { // 设置时间为当天开始时间 m.put("st", DateUtil.beginOfDay(m.get("st"))); m.put("et", DateUtil.beginOfDay(m.get("et"))); }).sorted(Comparator.comparing(x -> x.get("st"))).collect(Collectors.toList()); int repetition = 0; Date right = seTimes.get(0).get("et"); for (int i = 0; i < seTimes.size() - 1; i++) { Date stn = seTimes.get(i + 1).get("st"); Date etn = seTimes.get(i + 1).get("et"); if (right.compareTo(stn) > 0) { if (right.compareTo(etn) >= 0) { repetition += DateUtil.betweenDay(stn, etn, true); continue; } else if (right.compareTo(etn) < 0) { repetition += DateUtil.betweenDay(stn, right, true); } } right = etn; } return repetition; }1.