/**
* LocalDateTime时间类型判断两个时间范围是否有交集
* @param startA
* @param endA
* @param startB
* @param endB
* @return
*/
public static boolean isOverlap(LocalDateTime startA, LocalDateTime endA,
LocalDateTime startB, LocalDateTime endB) {
// 检查B的时间范围是否在A的左边
boolean bBeforeA = startB.isBefore(startA) && endB.isBefore(startA);
// 检查A的时间范围是否在B的右边
boolean aAfterB = startA.isAfter(startB) && endA.isAfter(startB);
// 如果上述两个条件都不满足,则说明有时间范围交叉
return !(bBeforeA || aAfterB);
}
/**
* Date 判断是否有任意一个时间范围与给定的时间范围有交集
* @param startA
* @param endA
* @param ranges
* @return
*/
public static boolean isAnyOverlap(Date startA, Date endA, List<Date[]> ranges) {
for (Date[] range : ranges) {
Date startB = range[0];
Date endB = range[1];
if (isOverlap(startA, endA, startB, endB)) {
return true; // 找到交叉,返回 true
}
}
return false; // 未找到交叉,返回 false
}
private static boolean isOverlap(Date startA, Date endA, Date startB, Date endB) {
// 检查B的结束时间是否在A的开始时间之前
boolean endBBeforeStartA = endB.before(startA);
// 检查A的结束时间是否在B的开始时间之前
boolean endABeforeStartB = endA.before(startB);
// 如果上述任一条件为真,则说明没有交叉
return !(endBBeforeStartA || endABeforeStartB);
}
/**
* LocalTime时间类型检查两个时间范围是否有交叉
* @param startA
* @param endA
* @param startB
* @param endB
* @return
*/
public static boolean isTimeOverlap(LocalTime startA, LocalTime endA,
LocalTime startB, LocalTime endB) {
// 确保时间范围是有效的
if (startA.isAfter(endA) || startB.isAfter(endB)) {
return false;
}
// 检查B的开始时间是否在A的结束时间之前,并且B的结束时间在A的开始时间之后
return !endB.isBefore(startA) && !startB.isAfter(endA);
}
/**
* LocalTime类型时间检查单个时间范围是否与列表中的任何时间范围交叉
* @param startB
* @param endB
* @param ranges
* @return
*/
public static boolean isOverlapWithAny(LocalTime startB, LocalTime endB, List<LocalTime[]> ranges) {
for (LocalTime[] range : ranges) {
LocalTime startA = range[0];
LocalTime endA = range[1];
if (isTimeOverlapWithAny(startA, endA, startB, endB)) {
return true; // 找到交叉,返回 true
}
}
return false; // 未找到交叉,返回 false
}
// 检查两个时间范围是否有交叉的辅助方法
private static boolean isTimeOverlapWithAny(LocalTime startA, LocalTime endA, LocalTime startB, LocalTime endB) {
// 确保时间范围有效
if (startA.isAfter(endA) || startB.isAfter(endB)) {
return false;
}
// 检查B的结束时间是否在A的开始时间之后且在A的结束时间之前
// 以及A的结束时间是否在B的开始时间之后且在B的结束时间之前
return !endB.isBefore(startA) && startB.isBefore(endA)
&& !endA.isBefore(startB) && startA.isBefore(endB);
}
public static LocalDateTime strToLocalDateTime(String dateStr,String pattern) {
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter);
return dateTime;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
判断时间是否有交叉重叠
最新推荐文章于 2024-09-14 21:48:00 发布