俩个时间区间之间取交集和并集

This commit is contained in:
韩帅 2022-02-11 11:39:16 +08:00
parent 7116177225
commit 879163a912
2 changed files with 65 additions and 15 deletions

View File

@ -20,26 +20,18 @@ import java.time.LocalDateTime;
import java.time.Year;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 时间工具类
*
* @author xiaoleilu
* @see LocalDateTimeUtil java8日志工具类
* @see DatePattern 日期常用格式工具类
*
* @author xiaoleilu
*/
public class DateUtil extends CalendarUtil {
@ -1889,6 +1881,32 @@ public class DateUtil extends CalendarUtil {
return new DateRange(start, end, unit);
}
/**
* 俩个时间区间取交集
*
* @param start 开始区间
* @param end 结束区间
* @return true 包含
*/
public static List<DateTime> rangeContains(DateRange start, DateRange end) {
List<DateTime> startDateTimes = CollUtil.newArrayList((Iterable<DateTime>) start);
List<DateTime> endDateTimes = CollUtil.newArrayList((Iterable<DateTime>) end);
return startDateTimes.stream().filter(endDateTimes::contains).collect(Collectors.toList());
}
/**
* 俩个时间区间取差集(end -> start)
*
* @param start 开始区间
* @param end 结束区间
* @return true 包含
*/
public static List<DateTime> rangeNotContains(DateRange start, DateRange end) {
List<DateTime> startDateTimes = CollUtil.newArrayList((Iterable<DateTime>) start);
List<DateTime> endDateTimes = CollUtil.newArrayList((Iterable<DateTime>) end);
return endDateTimes.stream().filter(item -> !startDateTimes.contains(item)).collect(Collectors.toList());
}
/**
* 按日期范围遍历执行 function
*

View File

@ -12,8 +12,8 @@ import java.util.NoSuchElementException;
/**
* {@link Range} 单元测试
* @author Looly
*
* @author Looly
*/
public class RangeTest {
@ -135,4 +135,36 @@ public class RangeTest {
Assert.assertEquals(DateUtil.parse("2017-01-01"), rangeToList.get(0));
Assert.assertEquals(DateUtil.parse("2017-01-02"), rangeToList.get(1));
}
@Test
public void rangeContains() {
// 开始区间
DateTime start = DateUtil.parse("2017-01-01");
DateTime end = DateUtil.parse("2017-01-31");
DateRange startRange = DateUtil.range(start, end, DateField.DAY_OF_YEAR);
// 结束区间
DateTime start1 = DateUtil.parse("2017-01-31");
DateTime end1 = DateUtil.parse("2017-02-02");
DateRange endRange = DateUtil.range(start1, end1, DateField.DAY_OF_YEAR);
// 交集
List<DateTime> dateTimes = DateUtil.rangeContains(startRange, endRange);
dateTimes.parallelStream().forEach(System.out::println);
}
@Test
public void rangeNotContains() {
// 开始区间
DateTime start = DateUtil.parse("2017-01-01");
DateTime end = DateUtil.parse("2017-01-30");
DateRange startRange = DateUtil.range(start, end, DateField.DAY_OF_YEAR);
// 结束区间
DateTime start1 = DateUtil.parse("2017-01-01");
DateTime end1 = DateUtil.parse("2017-01-31");
DateRange endRange = DateUtil.range(start1, end1, DateField.DAY_OF_YEAR);
// 差集
List<DateTime> dateTimes1 = DateUtil.rangeNotContains(startRange, endRange);
dateTimes1.parallelStream().forEach(System.out::println);
}
}