计算两个时间段的差集
2020-10-17 本文已影响0人
shen33
// 计算as->ae时间段 与 bs->be时间段的交集
private static LocalDate[] getTwoLocalDateSubtract(LocalDate as, LocalDate ae,
LocalDate bs, LocalDate be) {
/**
* 两个时间段的开始时间和结束时间分别是 As Ae 和Bs 和Be。
* As >Be || Ae <Bs 只要满足这个关系,就代表两个时间区间没有交集。
* !(As >Be || Ae <Bs) 则肯定有交叉区,并且交叉区肯定为四个时间点从小到大排序后中间两个点的时间区
* 在把as-ae 区间扣减掉交叉区的时间
*/
if (as.isAfter(be) || ae.isBefore(bs)) {
return new LocalDate[]{as, ae};
} else {
LocalDate[] dates = {as, ae, bs, be};
Arrays.sort(dates, LocalDate::compareTo);
// 交集 = dates[1]->dates[2]
LocalDate xs = dates[1];
LocalDate xe = dates[2];
// 判断 as—ae 与交叉区的差集
if (xs.equals(as) && xe.equals(ae)) {
return null;
}
if (as.isEqual(xs) && ae.isAfter(xe)) {
return new LocalDate[]{xe.plusDays(1), ae};
}
if (as.isBefore(xs) && ae.isAfter(xe)) {
return new LocalDate[]{as, xs.minusDays(1), xe.plusDays(1), ae};
}
if (as.isBefore(xs) && ae.isEqual(xe)) {
return new LocalDate[]{as, xs.minusDays(1)};
}
}
return null;
}