LocalTime实现并且考虑到跨夜情况
时间: 2024-03-05 18:48:03 浏览: 165
可以使用Java 17中的`java.time`包中的`LocalTime`类来实现该功能。以下是考虑跨夜情况的示例代码:
```java
import java.time.Duration;
import java.time.LocalTime;
public class TimeOverlapChecker {
public static boolean isOverlap(LocalTime start1, LocalTime end1, LocalTime start2, LocalTime end2) {
// 如果开始时间或结束时间为空,则不重叠
if (start1 == null || end1 == null || start2 == null || end2 == null) {
return false;
}
// 将开始时间和结束时间转换为持续时间
Duration duration1 = Duration.between(start1, end1);
Duration duration2 = Duration.between(start2, end2);
// 如果持续时间为0,则不重叠
if (duration1.isZero() || duration1.isNegative() || duration2.isZero() || duration2.isNegative()) {
return false;
}
// 计算第一个时间段的开始时间和结束时间的分钟数
int start1Minutes = start1.toSecondOfDay() / 60;
int end1Minutes = end1.toSecondOfDay() / 60;
// 如果结束时间小于开始时间,则表示跨夜,需要加上一天的分钟数
if (end1.isBefore(start1)) {
end1Minutes += 24 * 60;
}
// 计算第二个时间段的开始时间和结束时间的分钟数
int start2Minutes = start2.toSecondOfDay() / 60;
int end2Minutes = end2.toSecondOfDay() / 60;
// 如果结束时间小于开始时间,则表示跨夜,需要加上一天的分钟数
if (end2.isBefore(start2)) {
end2Minutes += 24 * 60;
}
// 计算两个时间段的开始时间和结束时间的最大值和最小值
int earliestStart = Math.min(start1Minutes, start2Minutes);
int latestEnd = Math.max(end1Minutes, end2Minutes);
// 如果最大持续时间小于等于两个持续时间之和,则重叠
return (latestEnd - earliestStart) <= (duration1.toMinutes() + duration2.toMinutes());
}
}
```
在上述代码中,我们首先将开始时间和结束时间转换为持续时间,并检查它们是否为零或负。如果持续时间为零或负,则意味着时间段无效,因此不可能重叠。接下来,我们将开始时间和结束时间转换为分钟数,并在跨夜情况下加上一天的分钟数。然后,我们计算了两个时间段的开始时间和结束时间的最大值和最小值,并计算了两个持续时间之和。最后,我们将最大持续时间与两个持续时间之和进行比较,以确定时间段是否重叠。
阅读全文