From 344212f5b6fe00e826ed1c2a2d29c7f188eab08d Mon Sep 17 00:00:00 2001 From: youzipi Date: Wed, 26 Jan 2022 18:36:15 +0800 Subject: [PATCH] feat(core:DateUtil): add `rangeFunc` and `rangeConsume` --- .../java/cn/hutool/core/date/DateUtil.java | 58 ++++++++++++++++--- .../java/cn/hutool/core/lang/RangeTest.java | 26 +++++++++ 2 files changed, 77 insertions(+), 7 deletions(-) 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 c887ef349..268083716 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,14 +20,10 @@ import java.time.LocalDateTime; import java.time.Year; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor; -import java.util.Calendar; -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; /** * 时间工具类 @@ -1885,6 +1881,54 @@ public class DateUtil extends CalendarUtil { return new DateRange(start, end, unit); } + /** + * 按日期范围遍历,执行 function + * + * @param start 起始日期时间(包括) + * @param end 结束日期时间 + * @param unit 步进单位 + * @param func 每次遍历要执行的 function + * @param + * @return + */ + public static List rangeFunc(Date start, Date end, final DateField unit, Function func) { + if (start == null || end == null || start.after(end)) { + return Collections.emptyList(); + } else { + ArrayList list = new ArrayList<>(); + DateRange dateRange = range(start, end, unit); + while (dateRange.hasNext()) { + DateTime next = dateRange.next(); + Date date = next.toJdkDate(); + T result = func.apply(date); + list.add(result); + } + return list; + } + } + + /** + * 按日期范围遍历,执行 consumer + * + * @param start 起始日期时间(包括) + * @param end 结束日期时间 + * @param unit 步进单位 + * @param consumer 每次遍历要执行的 consumer + * @return + */ + public static void rangeConsume(Date start, Date end, final DateField unit, Consumer consumer) { + if (start == null || end == null || start.after(end)) { + return; + } else { + DateRange dateRange = range(start, end, unit); + while (dateRange.hasNext()) { + DateTime next = dateRange.next(); + Date date = next.toJdkDate(); + consumer.accept(date); + } + } + } + /** * 创建日期范围生成器 * 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 c08e5dbb1..9feb53927 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 @@ -36,6 +36,32 @@ public class RangeTest { Assert.assertFalse(range.hasNext()); } + @Test + public void dateRangeFuncTest() { + DateTime start = DateUtil.parse("2021-01-01"); + DateTime end = DateUtil.parse("2021-01-03"); + + List dayOfMonthList = DateUtil.rangeFunc(start, end, DateField.DAY_OF_YEAR, a -> DateTime.of(a).dayOfMonth()); + Assert.assertArrayEquals(dayOfMonthList.toArray(new Integer[]{}), new Integer[]{1, 2, 3}); + + List dayOfMonthList2 = DateUtil.rangeFunc(null, null, DateField.DAY_OF_YEAR, a -> DateTime.of(a).dayOfMonth()); + Assert.assertArrayEquals(dayOfMonthList2.toArray(new Integer[]{}), new Integer[]{}); + } + + @Test + public void dateRangeConsumeTest() { + DateTime start = DateUtil.parse("2021-01-01"); + DateTime end = DateUtil.parse("2021-01-03"); + + StringBuilder sb = new StringBuilder(); + DateUtil.rangeConsume(start, end, DateField.DAY_OF_YEAR, a -> sb.append(DateTime.of(a).dayOfMonth()).append("#")); + Assert.assertEquals(sb.toString(), "1#2#3#"); + + StringBuilder sb2 = new StringBuilder(); + DateUtil.rangeConsume(null, null, DateField.DAY_OF_YEAR, a -> sb.append(DateTime.of(a).dayOfMonth()).append("#")); + Assert.assertEquals(sb2.toString(), ""); + } + @Test public void dateRangeTest2() { DateTime start = DateUtil.parse("2021-01-31");