指定时间范围,按照每日切分
例如:2023-09-01 00:00:00 - 2023-09-03 23:59:59,返回数据如下
2023-09-01 00:00:00 - 2023-09-01 23:59:59
2023-09-02 00:00:00 - 2023-09-02 23:59:59
2023-09-03 00:00:00 - 2023-09-03 10:59:59
例如:2023-09-01 10:00:00 - 2023-09-03 13:01:22,返回数据如下
2023-09-01 10:00:00 - 2023-09-01 23:59:59
2023-09-02 00:00:00 - 2023-09-02 23:59:59
2023-09-03 00:00:00 - 2023-09-03 13:01:22
完整代码如下
public class DateHelper {
/**
* 生成每日时间范围
*
* @param start 开始时间
* @param end 结束时间
* @return 时间范围
*/
public static List<TimeRange> dailyRanges(LocalDateTime start, LocalDateTime end) {
List<TimeRange> ranges = new ArrayList<>();
LocalDateTime current = start;
// 计算第一个日期的结束时间
LocalDateTime firstDayEnd = current.toLocalDate().atTime(23, 59, 59);
if (firstDayEnd.isAfter(end)) {
firstDayEnd = end; // 防止超出结束时间
}
ranges.add(new TimeRange(current, firstDayEnd)); // 添加第一个日期区间
// 将当前时间设置为下一天的开始
current = current.toLocalDate().plusDays(1).atStartOfDay();
// 生成日期范围,直到达到结束日期
while (current.toLocalDate().isBefore(end.toLocalDate()) || current.toLocalDate().isEqual(end.toLocalDate())) {
LocalDateTime nextDay = current.plusDays(1);
LocalDateTime endOfDay = nextDay.minusSeconds(1); // 这个可以用来表示23:59:59
// 如果是最后一天,使用实际的结束时间
if (nextDay.isAfter(end)) {
endOfDay = end;
}
ranges.add(new TimeRange(current, endOfDay)); // 添加剩余的日期区间
current = nextDay; // 转到下一天
}
return ranges;
}
@Data
@AllArgsConstructor
public static class TimeRange {
private LocalDateTime start;
private LocalDateTime end;
}
}
测试代码如下
public static void main(String[] args) {
LocalDateTime star = LocalDateTime.of(2023, 9, 1, 10, 0, 0);
LocalDateTime end = LocalDateTime.of(2023, 9, 3, 13, 1, 22);
DateHelper.dailyRanges(star, end).forEach(f -> {
System.out.println(new DateTime(f.getStart()) + " - " + new DateTime(f.getEnd()));
});
}