mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-04-19 03:01:48 +08:00
feat(core:DateUtil): add rangeFunc
and rangeConsume
This commit is contained in:
parent
201290d7c4
commit
344212f5b6
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建日期范围生成器
|
* 创建日期范围生成器
|
||||||
*
|
*
|
||||||
|
@ -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");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user