获取两个时间段的交并集
package com.yxs.project;
import java.time.LocalDate;
import java.util.*;
public class DateAlgorithm {
public final static int INTERSECTION = 0;
public final static int UNION = 1;
public static void main(String[] args) {
List<LocalDate[]> localDates = twoTimePeriods(
new LocalDate[]{LocalDate.of(2023, 8, 12), LocalDate.of(2023, 8, 15)},
new LocalDate[]{LocalDate.of(2023, 8, 17), LocalDate.of(2023, 8, 17)},
DateAlgorithm.UNION
);
if (localDates != null && !localDates.isEmpty()) {
for (LocalDate[] periods : localDates) {
System.out.println(Arrays.toString(periods));
}
}
}
public static List<LocalDate[]> twoTimePeriods(LocalDate[] periods1, LocalDate[] periods2, int type) {
boolean valid1 = Objects.nonNull(periods1)
&& periods1.length > 1
&& periods1[0] != null
&& periods1[1] != null
&& (periods1[0].isEqual(periods1[1]) || periods1[0].isBefore(periods1[1]));
boolean valid2 = Objects.nonNull(periods2)
&& periods2.length > 1
&& periods2[0] != null
&& periods2[1] != null
&& (periods2[0].isEqual(periods2[1]) || periods2[0].isBefore(periods2[1]));
if (valid1 && valid2) {
if (INTERSECTION == type) {
LocalDate[] intersection = twoTimePeriodsIntersection(periods1, periods2);
if (Objects.nonNull(intersection)) {
return Collections.singletonList(intersection);
}
}
if (UNION == type) {
return twoTimePeriodsUnion(periods1, periods2);
}
}
return null;
}
public static LocalDate[] twoTimePeriodsIntersection(LocalDate[] periods1, LocalDate[] periods2) {
if (!(periods1[0].isAfter(periods2[1]) || periods2[0].isAfter(periods1[1]))) {
return new LocalDate[]{
periods1[0].isAfter(periods2[0]) ? periods1[0] : periods2[0],
periods1[1].isBefore(periods2[1]) ? periods1[1] : periods2[1]
};
}
return null;
}
public static List<LocalDate[]> twoTimePeriodsUnion(LocalDate[] periods1, LocalDate[] periods2) {
List<LocalDate[]> periodsList = new ArrayList<>(2);
if (periods1[0].isAfter(periods2[1]) || periods2[0].isAfter(periods1[1])) {
periodsList.add(periods1);
periodsList.add(periods2);
} else {
periodsList.add(
new LocalDate[]{
periods1[0].isBefore(periods2[0]) ? periods1[0] : periods2[0],
periods1[1].isAfter(periods2[1]) ? periods1[1] : periods2[1]
}
);
}
return periodsList;
}
}