@Getter public static class DateRange { private final Date start; private final Date end; public DateRange(Date start, Date end) { this.start = start; this.end = end; } @Override public String toString() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); return "[" + format.format(start) + ", " + format.format(end) + "]"; } }
/** * 从给定的大日期范围内减去多个小日期范围,并返回剩余的日期范围列表。 * * @param largeRange 大日期范围 * @param smallRanges 小日期范围列表 * @return 剩余的日期范围列表 */ public static List<DateRange> subtractRanges(DateRange largeRange, List<DateRange> smallRanges) { List<DateRange> result = new ArrayList<>(); result.add(largeRange); for (DateRange range : smallRanges) { List<DateRange> tempResult = new ArrayList<>(); for (DateRange r : result) { // 如果小日期范围在大日期范围之前或之后,则保留当前剩余日期范围不变 if (range.getEnd().before(r.getStart()) || range.getStart().after(r.getEnd())) { tempResult.add(r); } else { // 如果小日期范围完全包含于大日期范围内,则分割大日期范围 if (range.getStart().after(r.getStart())) { tempResult.add(new DateRange(r.getStart(), cn.hutool.core.date.DateUtil.offsetDay(range.getStart(), -1))); } if (range.getEnd().before(r.getEnd())) { tempResult.add(new DateRange(cn.hutool.core.date.DateUtil.offsetDay(range.getEnd(), 1), r.getEnd())); } } } // 更新剩余日期范围列表 result = tempResult; } return result; }