diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java index 164855a09..b36a12cb5 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateUtil.java @@ -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 rangeContains(DateRange start, DateRange end) { + List startDateTimes = CollUtil.newArrayList((Iterable) start); + List endDateTimes = CollUtil.newArrayList((Iterable) end); + return startDateTimes.stream().filter(endDateTimes::contains).collect(Collectors.toList()); + } + + /** + * 俩个时间区间取差集(end -> start) + * + * @param start 开始区间 + * @param end 结束区间 + * @return true 包含 + */ + public static List rangeNotContains(DateRange start, DateRange end) { + List startDateTimes = CollUtil.newArrayList((Iterable) start); + List endDateTimes = CollUtil.newArrayList((Iterable) end); + return endDateTimes.stream().filter(item -> !startDateTimes.contains(item)).collect(Collectors.toList()); + } + /** * 按日期范围遍历,执行 function * @@ -1896,7 +1914,7 @@ public class DateUtil extends CalendarUtil { * @param end 结束日期时间 * @param unit 步进单位 * @param func 每次遍历要执行的 function - * @param Date经过函数处理结果类型 + * @param Date经过函数处理结果类型 * @return 结果列表 * @since 5.7.21 */ @@ -1905,7 +1923,7 @@ public class DateUtil extends CalendarUtil { return Collections.emptyList(); } ArrayList list = new ArrayList<>(); - for(DateTime date : range(start, end, unit)){ + for (DateTime date : range(start, end, unit)) { list.add(func.apply(date)); } return list; diff --git a/hutool-core/src/test/java/cn/hutool/core/lang/RangeTest.java b/hutool-core/src/test/java/cn/hutool/core/lang/RangeTest.java index 9feb53927..c7ba874f3 100644 --- a/hutool-core/src/test/java/cn/hutool/core/lang/RangeTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/lang/RangeTest.java @@ -12,8 +12,8 @@ import java.util.NoSuchElementException; /** * {@link Range} 单元测试 - * @author Looly * + * @author Looly */ public class RangeTest { @@ -110,7 +110,7 @@ public class RangeTest { } @Test - public void rangeDayOfYearTest(){ + public void rangeDayOfYearTest() { DateTime start = DateUtil.parse("2017-01-01"); DateTime end = DateUtil.parse("2017-01-05"); @@ -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 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 dateTimes1 = DateUtil.rangeNotContains(startRange, endRange); + dateTimes1.parallelStream().forEach(System.out::println); + } + }