feat(core:DateUtil): add rangeFunc and rangeConsume

This commit is contained in:
youzipi 2022-01-26 18:36:15 +08:00
parent 201290d7c4
commit 344212f5b6
2 changed files with 77 additions and 7 deletions

View File

@ -20,14 +20,10 @@ import java.time.LocalDateTime;
import java.time.Year; import java.time.Year;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAccessor; import java.time.temporal.TemporalAccessor;
import java.util.Calendar; import java.util.*;
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.concurrent.TimeUnit; 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); return new DateRange(start, end, unit);
} }
/**
* 按日期范围遍历执行 function
*
* @param start 起始日期时间包括
* @param end 结束日期时间
* @param unit 步进单位
* @param func 每次遍历要执行的 function
* @param <T>
* @return
*/
public static <T> List<T> rangeFunc(Date start, Date end, final DateField unit, Function<Date, T> func) {
if (start == null || end == null || start.after(end)) {
return Collections.emptyList();
} else {
ArrayList<T> 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<Date> 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);
}
}
}
/** /**
* 创建日期范围生成器 * 创建日期范围生成器
* *

View File

@ -36,6 +36,32 @@ public class RangeTest {
Assert.assertFalse(range.hasNext()); Assert.assertFalse(range.hasNext());
} }
@Test
public void dateRangeFuncTest() {
DateTime start = DateUtil.parse("2021-01-01");
DateTime end = DateUtil.parse("2021-01-03");
List<Integer> 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<Integer> 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 @Test
public void dateRangeTest2() { public void dateRangeTest2() {
DateTime start = DateUtil.parse("2021-01-31"); DateTime start = DateUtil.parse("2021-01-31");