hutool日期工具类相关:获取两个时间之间的所有日期、所有时间段(x分钟一个时段)、获取连续的时间段

好久没更新了,太忙了,好几个项目,新旧项目齐上阵,加需求 、改需求、改bug,怎么都改不完呐。经常就是在好几个项目里打转,一下改这个,一下忙那个,一下说这个很急先做这个,一下又说那个很急先赶那个,心都静不下来,分身乏术。几个项目切来切去,每天都是头痛欲裂的一天呐。

获取开始、结束日期之间的所有日期

有下面两种方式,都一样的,看自己的日期格式是LocalDate 还是 DateTime

/**
 * 根据开始、结束时间获取它们之间的所有日期
 */
public static List<String> rangeDay(DateTime start,DateTime end){
    List<String> dates = new LinkedList<>();
    DateTime currentDate = start;
    while (!currentDate.isAfter(end)) {
        dates.add(DateUtil.format(currentDate,"M月d日"));
        currentDate = currentDate.offset(DateField.DAY_OF_MONTH,1);
    }
    return dates;
}

/**
 * 根据开始、结束日期获取它们之间的所有日期
 */
public static List<String> rangeDay(LocalDate start, LocalDate end){
    List<String> dates = new LinkedList<>();
    LocalDate currentDate = start;
    while (!currentDate.isAfter(end)) {
        dates.add(LocalDateTimeUtil.format(currentDate,"M月d日"));
        currentDate = currentDate.plusDays(1);
    }
    return dates;
}

获取开始、结束时间之间的所有时间段(每隔x分钟一个时段)

因为是每隔15分钟为一个时段,所以开始、结束时间的分钟数必须是15的倍数,比如:00分、15分、30分、45分 这样,不然拿不到。

这个就看自己需求了,你要每隔1分钟一个时段那就无所谓开始、结束时间的分钟数是什么。还有比如每隔5分钟、10分钟一个时段,那这个开始、结束时间的分钟数必须是5或10的倍数才行。

/**
 * 获取两个时间之间的所有时间段(每15分钟一个时间段)
 * @param startTimeStr
 * @param endTimeStr
 */
public static List<String> getTimePeriodStr(String startTimeStr,String endTimeStr,String formatter){
    LocalDateTime startTime = LocalDateTimeUtil.parse(startTimeStr, "yyyy-MM-dd HH:mm:ss");
    LocalDateTime endTime = LocalDateTimeUtil.parse(endTimeStr, "yyyy-MM-dd HH:mm:ss");
    return getTimePeriodStr(startTime,endTime,formatter);
}

/**
 * 获取两个时间之间的所有时间段(每15分钟一个时间段)
 */
public static List<String> getTimePeriodStr(LocalDateTime startTime,LocalDateTime endTime,String formatter){
    List<String> result = new LinkedList<>();
    List<LocalDateTime> dataList = getTimePeriod(startTime,endTime);
    for (LocalDateTime time : dataList) {
        result.add(time.format(DateTimeFormatter.ofPattern(formatter)));
    }
    return result;
}

/**
 * 获取两个时间之间的所有时间段(每15分钟一个时间段)
 */
public static List<LocalDateTime> getTimePeriod(LocalDateTime startTime,LocalDateTime endTime){
    List<LocalDateTime> result = new LinkedList<>();
    LocalDateTime currentTime = startTime;
    while (!currentTime.isAfter(endTime)) {
    	// 如果需要改成每x分钟一个时间段,那就把15改成x
    	if (currentTime.getMinute() % 15 == 0) {
        //if (currentTime.getMinute() % x == 0) {
            result.add(currentTime);
        }
        currentTime = currentTime.plusMinutes(15); // 这里也是把加15分钟改成加x分钟
        //currentTime = currentTime.plusMinutes(x);
    }
    return result;
}

获取连续的时间段(每x分钟一个时间段)

这里和上面那个获取所有时间段是同样的道理,因为是每15分钟一个时间段,所以时间段列表必须是15的倍数,比如:00分、15分、30分、45分 这样,不然拿不到。如果需要改成每x分钟一个时间段,那么时间段列表的分钟数也需要改成x的倍数。

/**
 * 获取连续的时间段(每隔15分钟),连续时段进行合并,并且如果连续时段跨班次则需要进行拆分
 * @param dateList 时间段列表
 * @return 连续的时间段
 */
public static Map<String,List<LocalDateTime>> findContinuousTimeStr(List<String> dateList) {
    String format = "yyyy-MM-dd HH:mm:ss";
    List<LocalDateTime> dateTimeList = dateList.stream().distinct().map(t -> LocalDateTimeUtil.parse(t, format)).collect(Collectors.toList());
    return findContinuousTime(dateTimeList);
}

/**
 * 获取连续的时间段(每隔15分钟),连续时段进行合并,并且如果连续时段跨班次则需要进行拆分
 * @param dateTimeList 时间段列表
 * @return 连续的时间段
 */
public static Map<String,List<LocalDateTime>> findContinuousTime(List<LocalDateTime> dateTimeList) {
    dateTimeList = dateTimeList.stream().distinct().sorted().collect(Collectors.toList());
    LocalDateTime start = dateTimeList.get(0);
    LocalDateTime end = dateTimeList.get(0);
    Map<String,List<LocalDateTime>> continuousTime = new LinkedHashMap<>();
    List<LocalDateTime> list = new LinkedList<>(); // 每个连续时段的所有时段列表
    for (int i = 1; i <= dateTimeList.size(); i++) {
        LocalDateTime current = dateTimeList.get(i - 1);
        list.add(current);
        // 最后一个元素
        if (i == dateTimeList.size()){
            if (end.isEqual(current)) {
                String key = start + "#" + end;
                if (!continuousTime.containsKey(key)){
                    continuousTime.put(key,list);
                }
            }
            break;
        }

        // 计算15分钟间隔的连续时间段(如果需要每x分钟一个时间段,那就把15改成x)
        if (dateTimeList.get(i).isEqual(current.plusMinutes(15))) {
            end = dateTimeList.get(i);
        } else {
            String key = start + "#" + end;
            if (!continuousTime.containsKey(key)){
                continuousTime.put(key,list);
            }
            list = new LinkedList<>();
            start = dateTimeList.get(i);
            end = dateTimeList.get(i);
        }
    }
    return continuousTime;
}

public static void main(String[] args) {
    List<String> dateList = new ArrayList<>();
    dateList.add("2024-05-20 07:00:00");
    dateList.add("2024-05-20 07:45:00");
    dateList.add("2024-05-20 08:30:00");
    dateList.add("2024-05-20 07:15:00");
    dateList.add("2024-05-20 07:30:00");
    dateList.add("2024-05-20 08:15:00");
    dateList.add("2024-05-20 08:15:00");
    dateList.add("2024-05-20 09:15:00");
    dateList.add("2024-05-20 09:15:00");
    dateList.add("2024-05-20 08:45:00");
    dateList.add("2024-05-20 09:45:00");
    dateList.add("2024-05-20 07:00:00");

    Map<String, List<LocalDateTime>> continuousTimeStr = findContinuousTimeStr(dateList);
    for (String key : continuousTimeStr.keySet()) {
        List<LocalDateTime> values = continuousTimeStr.get(key);
        System.out.println("时段:" + key.replace("#"," 至 "));
        for (LocalDateTime value : values) {
            System.out.println("\t" + value);
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

符华-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值