指定时间范围,按照每日切分

例如: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()));
    });
}
更新日期:
作者: devin.ding