日期范围-DateRange
# 介绍
DateRange是Hutool中用于处理日期范围的类,提供了丰富的日期范围操作,包括范围的创建、遍历、判断等功能,简化了日期范围相关的编程。
# 主要功能
# 1. 日期范围的创建
// 创建指定开始和结束日期的范围
Date start = DateUtil.parse("2023-01-01");
Date end = DateUtil.parse("2023-12-31");
DateRange range = new DateRange(start, end);
// 使用字符串创建日期范围
DateRange range = new DateRange("2023-01-01", "2023-12-31");
// 创建当前月的日期范围
DateRange currentMonth = DateRange.month();
// 创建指定年份月份的日期范围
DateRange monthRange = DateRange.month(2023, 12);
// 创建当前周的日期范围
DateRange currentWeek = DateRange.week();
// 创建当前年的日期范围
DateRange currentYear = DateRange.year();
# 2. 日期范围的属性获取
// 获取开始日期
Date start = range.getStart();
// 获取结束日期
Date end = range.getEnd();
// 获取日期范围的天数
long days = range.days();
// 获取日期范围的周数
long weeks = range.weeks();
// 判断日期范围是否包含今天
boolean containsToday = range.contains(new Date());
// 判断日期范围是否包含指定日期
boolean containsDate = range.contains(DateUtil.parse("2023-06-15"));
# 3. 日期范围的遍历
// 遍历日期范围内的每一天
for (Date date : range) {
Console.log(DateUtil.formatDate(date));
}
// 遍历日期范围内的每一天,使用步进
for (Date date : DateRange.of("2023-01-01", "2023-01-10", DateField.DAY_OF_MONTH, 2)) {
Console.log(DateUtil.formatDate(date)); // 输出:2023-01-01, 2023-01-03, 2023-01-05, 2023-01-07, 2023-01-09
}
// 遍历日期范围内的每一周
DateRange yearRange = DateRange.year(2023);
for (DateRange weekRange : yearRange.range(DateField.WEEK_OF_YEAR)) {
Console.log("周开始:" + DateUtil.formatDate(weekRange.getStart()) + ", 周结束:" + DateUtil.formatDate(weekRange.getEnd()));
}
// 遍历日期范围内的每一月
DateRange yearRange = DateRange.year(2023);
for (DateRange monthRange : yearRange.range(DateField.MONTH)) {
Console.log("月开始:" + DateUtil.formatDate(monthRange.getStart()) + ", 月结束:" + DateUtil.formatDate(monthRange.getEnd()));
}
# 4. 日期范围的比较
DateRange range1 = DateRange.of("2023-01-01", "2023-06-30");
DateRange range2 = DateRange.of("2023-07-01", "2023-12-31");
DateRange range3 = DateRange.of("2023-04-01", "2023-09-30");
// 判断两个范围是否相交
boolean isIntersect = range1.isIntersect(range3); // true
boolean isIntersect = range1.isIntersect(range2); // false
// 判断一个范围是否包含另一个范围
boolean isContains = range1.contains(range3); // false
DateRange range4 = DateRange.of("2023-02-01", "2023-03-31");
boolean isContains = range1.contains(range4); // true
// 获取两个范围的交集
DateRange intersectRange = range1.intersect(range3);
Console.log("交集开始:" + DateUtil.formatDate(intersectRange.getStart()) + ", 交集结束:" + DateUtil.formatDate(intersectRange.getEnd())); // 2023-04-01 到 2023-06-30
// 获取两个范围的并集
List<DateRange> unionRanges = range1.union(range3);
for (DateRange unionRange : unionRanges) {
Console.log("并集开始:" + DateUtil.formatDate(unionRange.getStart()) + ", 并集结束:" + DateUtil.formatDate(unionRange.getEnd())); // 2023-01-01 到 2023-09-30
}
# 5. 日期范围的调整
// 扩展日期范围
DateRange extendedRange = range.expand(7, DateField.DAY_OF_MONTH); // 前后各扩展7天
// 缩小日期范围
DateRange contractedRange = range.contract(7, DateField.DAY_OF_MONTH); // 前后各缩小7天
// 偏移日期范围
DateRange offsetRange = range.offset(1, DateField.MONTH); // 日期范围整体向后偏移1个月
// 拆分日期范围
List<DateRange> splitRanges = range.split(DateField.MONTH); // 按月份拆分为多个范围
# 适用场景
DateRange适用于以下场景:
- 需要处理日期范围时
- 需要遍历日期范围内的日期时
- 需要判断日期是否在范围内时
- 需要计算日期范围的交集、并集时
- 需要拆分或调整日期范围时
- 需要处理周期性日期范围时
通过DateRange,开发者可以更加便捷地处理日期范围相关的业务逻辑,避免了繁琐的日期计算和判断。