/**
* 判断多个时间段是否有重叠(交集)
*
* @param rangeList 时间段数组
* @param isStrict 是否严格重叠,true 严格,没有任何相交或相等;false 不严格,可以首尾相等
* @return 返回是否重叠
*/
public static boolean isOverlap(List<Range> rangeList, boolean isStrict) {
rangeList = rangeList.stream().sorted(Comparator.comparingLong(Range::getStart)).collect(Collectors.toList());
for (int i = 1; i < rangeList.size(); i ++) {
if (isStrict) {
if (!(rangeList.get(i - 1).getEnd() < rangeList.get(i).getStart())) {
return true;
}
} else {
if (!(rangeList.get(i - 1).getEnd() <= rangeList.get(i).getStart())) {
return true;
}
}
}
//最后一个班次如果跨天
if (rangeList.get(rangeList.size() - 1).getEnd() < rangeList.get(rangeList.size() - 1).getStart() && rangeList.get(rangeList.size() - 1).getEnd() > rangeList.get(0).getStart()){
return true;
}
return false;
}
@Data
static class Range{
private Integer sort;
private long start;
private long end;
}
private Range handle(String timeRange){
String[] rangeArr = timeRange.split("-");
String startTime = rangeArr[0].trim();
String endTime = rangeArr[1].trim();
Range range = new Range();
Date startDate = null;
Date endDate = null;
try {
startDate = DateUtils.parseDate(startTime, "HH:mm");
endDate = DateUtils.parseDate(endTime, "HH:mm");
} catch (Exception e) {
log.error("时间格式转换异常:" + e.getMessage());
}
range.setStart(startDate.getTime());
range.setEnd(endDate.getTime());
return range;
}
public static void main(String[] args) {
List<Range> rangeList = Lists.newArrayList();
List<String> list = new ArrayList<>();
list.add("0:00-8:00");
list.add("8:00-18:00");
list.add("18:30-23:59");
Demo service = new Demo();
list.forEach(item -> {
rangeList.add(service.handle(item));
});
if (!CollectionUtils.isEmpty(rangeList)) {
if (isOverlap(rangeList, false)) {
System.out.println("时间段有重叠");
}else{
System.out.println("时间段没有有重叠");
}
}
}