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);
}