上述程序修改为 如果该时间段包含了非工作时间,则算作连续的工作时间
时间: 2024-02-11 08:07:42 浏览: 18
好的,以下是修改后的程序,主要修改是在 `checkWorkTime` 函数中的判断逻辑:
```java
public boolean checkWorkTime(String dailyWorkTime, String availableWorkTime, int requiredTime) {
// 将日常工作时间段和剩余可用工作时间段分别解析为时间段列表
List<TimeRange> dailyRanges = parseTimeRanges(dailyWorkTime);
List<TimeRange> availableRanges = parseTimeRanges(availableWorkTime);
// 遍历剩余可用工作时间段,查找是否存在连续的时间段满足工作时间
int accumulatedTime = 0;
for (TimeRange range : availableRanges) {
if (!isWorkTimeRange(dailyRanges, range, true)) {
// 如果该时间段包含了非工作时间,则跳过
accumulatedTime = 0;
continue;
}
accumulatedTime += range.getDuration();
if (accumulatedTime >= requiredTime) {
// 如果累计时间已经满足要求,则返回 true
return true;
}
}
// 如果遍历完所有时间段仍未找到满足要求的时间段,则返回 false
return false;
}
// 判断时间段是否为工作时间段
private boolean isWorkTimeRange(List<TimeRange> dailyRanges, TimeRange range, boolean allowNonWorkTime) {
for (TimeRange dailyRange : dailyRanges) {
if (range.overlaps(dailyRange) && (allowNonWorkTime || dailyRange.contains(range))) {
return true;
}
}
return false;
}
// 表示一个时间段的类
private static class TimeRange {
private final Time startTime;
private final Time endTime;
TimeRange(Time startTime, Time endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
// 判断两个时间段是否有重叠部分
boolean overlaps(TimeRange other) {
return !this.endTime.before(other.startTime) && !other.endTime.before(this.startTime);
}
// 判断一个时间段是否包含另一个时间段
boolean contains(TimeRange other) {
return !this.startTime.after(other.startTime) && !this.endTime.before(other.endTime);
}
// 获取时间段的时长(分钟数)
int getDuration() {
return (int) ((endTime.getTime() - startTime.getTime()) / (60 * 1000));
}
}
```
使用示例:
```java
boolean result = checkWorkTime("08:00-09:00;13:00-15:00", "08:58-09:00;13:00-14:00", 120);
System.out.println(result); // 输出 true
```
需要注意的是,如果一个可用工作时间段包含了多个非工作时间段,那么这些非工作时间段之间的时间也会被算作连续的工作时间。例如,如果日常工作时间段为 `08:00-09:00;11:00-12:00`,可用工作时间段为 `08:30-08:45;09:30-10:30`,那么算作连续的工作时间的时间段为 `08:30-09:00` 和 `11:00-12:00`。