Java 时间段合并工具类

142 阅读1分钟
public class TimeMergeUtils {

    public static List<TimeSlot> mergeTimeSlots(List<TimeSlot> timeSlotList) {
        List<TimeSlot> resultList = new ArrayList<>();
        timeSlotList = sortTimeSlots(timeSlotList);
        for (int i = 1; ; i++) {
            if (timeSlotList.size() <= 1) {
                if (timeSlotList.size() == 1) {
                    resultList.add(timeSlotList.get(0));
                }
                break;
            }
            TimeSlot last = timeSlotList.get(timeSlotList.size() - 1);
            TimeSlot beLast = timeSlotList.get(timeSlotList.size() - 2);
            TimeSlot m = mergeTime(beLast, last);
            if (null != m) {
                timeSlotList.remove(last);
                timeSlotList.remove(beLast);
                timeSlotList.add(m);
            } else {
                resultList.add(last);
                timeSlotList.remove(last);
            }

        }
        return CollUtil.reverse(resultList);
    }

    private static TimeSlot mergeTime(TimeSlot beLast, TimeSlot last) {
        TimeSlot timeSlot = null;
        if (beLast.getStartTime().isEqual(last.getStartTime())) {
            timeSlot = new TimeSlot();
            timeSlot.setStartTime(beLast.getStartTime());
            timeSlot.setEndTime(beLast.getEndTime().isBefore(last.getEndTime()) ? last.getEndTime() : beLast.getEndTime());
            return timeSlot;
        } else if (beLast.getEndTime().isEqual(last.getStartTime())) {
            timeSlot = new TimeSlot();
            timeSlot.setStartTime(beLast.getStartTime());
            timeSlot.setEndTime(last.getEndTime());
            return timeSlot;
        } else if (beLast.getEndTime().isEqual(last.getEndTime())) {
            timeSlot = new TimeSlot();
            timeSlot.setStartTime(beLast.getStartTime().isBefore(last.getStartTime()) ? beLast.getStartTime() : last.getStartTime());
            timeSlot.setEndTime(beLast.getEndTime());
            return timeSlot;
        } else if (beLast.getEndTime().isAfter(last.getStartTime())) {
            timeSlot = new TimeSlot();
            timeSlot.setStartTime(beLast.getStartTime().isBefore(last.getStartTime()) ? beLast.getStartTime() : last.getStartTime());
            timeSlot.setEndTime(beLast.getEndTime().isBefore(last.getEndTime()) ? last.getEndTime() : beLast.getEndTime());
        }
        return timeSlot;
    }


    private static List<TimeSlot> sortTimeSlots(List<TimeSlot> timeSlotList) {
        return timeSlotList.stream().sorted(Comparator.comparing(TimeSlot::getStartTime)).collect(Collectors.toList());
    }

    public static void main(String[] args) {
        ArrayList<TimeSlot> timeSlots = new ArrayList<>();
        TimeSlot timeSlot1 = new TimeSlot();
        timeSlot1.setStartTime(LocalDateTime.of(2023, 2, 15, 7, 0, 0));
        timeSlot1.setEndTime(LocalDateTime.of(2023, 2, 15, 12, 0, 0));
        timeSlots.add(timeSlot1);
        TimeSlot timeSlot2= new TimeSlot();
        timeSlot2.setStartTime(LocalDateTime.of(2023, 2, 15, 8, 0, 0));
        timeSlot2.setEndTime(LocalDateTime.of(2023, 2, 15, 10, 0, 0));
        timeSlots.add(timeSlot2);

        TimeSlot timeSlot3= new TimeSlot();
        timeSlot3.setStartTime(LocalDateTime.of(2023, 2, 15, 18, 0, 0));
        timeSlot3.setEndTime(LocalDateTime.of(2023, 2, 15, 23, 0, 0));
        timeSlots.add(timeSlot3);
        List<TimeSlot> timeSlotList = TimeMergeUtils.mergeTimeSlots(timeSlots);
    }

}
@EqualsAndHashCode(callSuper = false)
@Data
public class TimeSlot extends BaseBo {

    /**
     * 开始时间
     */
    private LocalDateTime startTime;

    /**
     * 结束时间
     */
    private LocalDateTime endTime;

    @Override
    public String toLog() {
        return toString();
    }

}
public static List<String> getMonthBetween(String minDate, String maxDate){
    List<String> result = new ArrayList<>();
    try {
        // 格式化为年月
        SimpleDateFormat sdf = new SimpleDateFormat(MONTH_PATTERN);

        Calendar min = Calendar.getInstance();
        Calendar max = Calendar.getInstance();
        min.setTime(sdf.parse(minDate));
        min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);

        max.setTime(sdf.parse(maxDate));
        max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);

        while (min.before(max)) {
            result.add(sdf.format(min.getTime()));
            min.add(Calendar.MONTH, 1);
        }
    } catch (ParseException e) {
        return new ArrayList<>();
    }
    return result;
}
public static List<String> getHistoryMonth(String date) {
    List<String> result = new ArrayList<>();
    try {
        // 格式化为年月
        SimpleDateFormat sdf = new SimpleDateFormat(MONTH_PATTERN);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sdf.parse(date));
        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), 1);
        for (int i = 0; i < 12; i++) {
            result.add(sdf.format(calendar.getTime()));
            calendar.add(Calendar.MONTH, -1);
        }
    } catch (ParseException e) {
        return new ArrayList<>();
    }
    return CollUtil.reverse(result);
}