计算两个时间段的差集

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


上一篇下一篇

猜你喜欢

热点阅读