日期范围中切分成若干个子范围

  作者:记性不好的阁主


@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;
}



相关推荐

评论 抢沙发

表情

分类选择