需要编写一个Java类实现此需求
时间: 2024-02-11 11:06:54 浏览: 20
好的,那么我可以为您提供一个简单的 Java 类来实现这个需求。请参考以下代码:
```java
import java.time.Duration;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
public class WorkTimeChecker {
private List<TimeRange> workRanges = new ArrayList<>();
private List<TimeRange> freeRanges = new ArrayList<>();
public WorkTimeChecker(String workTimeStr, String freeTimeStr) {
String[] workTimeRanges = workTimeStr.split(";");
String[] freeTimeRanges = freeTimeStr.split(";");
for (String range : workTimeRanges) {
workRanges.add(new TimeRange(range));
}
for (String range : freeTimeRanges) {
freeRanges.add(new TimeRange(range));
}
}
public boolean isWorkTimeEnough(int durationMins) {
List<TimeRange> availableRanges = getAvailableRanges();
for (TimeRange range : availableRanges) {
if (range.getDuration().compareTo(Duration.ofMinutes(durationMins)) >= 0) {
System.out.println("满足工作时间的时间段开始时间:" + range.getStart());
return true;
}
}
return false;
}
private List<TimeRange> getAvailableRanges() {
List<TimeRange> availableRanges = new ArrayList<>();
for (TimeRange workRange : workRanges) {
TimeRange availableRange = workRange;
for (TimeRange freeRange : freeRanges) {
if (availableRange.contains(freeRange)) {
List<TimeRange> splitRanges = availableRange.split(freeRange);
availableRanges.addAll(splitRanges);
availableRange = null;
break;
} else if (freeRange.getEnd().isBefore(availableRange.getStart())) {
// freeRange 在 availableRange 左侧,跳过
continue;
} else if (freeRange.getStart().isAfter(availableRange.getEnd())) {
// freeRange 在 availableRange 右侧,直接添加 availableRange
availableRanges.add(availableRange);
availableRange = null;
break;
} else {
// freeRange 在 availableRange 中间,拆分 availableRange
List<TimeRange> splitRanges = availableRange.split(freeRange);
availableRanges.addAll(splitRanges);
availableRange = null;
break;
}
}
if (availableRange != null) {
availableRanges.add(availableRange);
}
}
return availableRanges;
}
private static class TimeRange {
private LocalTime start;
private LocalTime end;
public TimeRange(String rangeStr) {
String[] parts = rangeStr.split("-");
this.start = LocalTime.parse(parts[0]);
this.end = LocalTime.parse(parts[1]);
}
public LocalTime getStart() {
return start;
}
public LocalTime getEnd() {
return end;
}
public Duration getDuration() {
return Duration.between(start, end);
}
public boolean contains(TimeRange other) {
return this.start.isBefore(other.start) && this.end.isAfter(other.end);
}
public List<TimeRange> split(TimeRange other) {
List<TimeRange> ranges = new ArrayList<>();
if (this.start.isBefore(other.start)) {
ranges.add(new TimeRange(this.start, other.start));
}
if (this.end.isAfter(other.end)) {
ranges.add(new TimeRange(other.end, this.end));
}
return ranges;
}
public TimeRange(LocalTime start, LocalTime end) {
this.start = start;
this.end = end;
}
}
}
```
这个类的构造函数接收两个字符串参数,分别表示设备的日常工作时间段和未工作的空闲时间段。例如:
```java
WorkTimeChecker checker = new WorkTimeChecker("08:00-12:00;13:00-17:00", "09:00-10:00;14:00-15:00");
```
这个类还有一个 `isWorkTimeEnough` 方法,接收一个整数参数,表示某个工序需要的工作时间(单位为分钟)。这个方法会返回一个布尔值,表示设备这天的连续工作时段是否大于等于这个工序需要的工作时间。如果满足条件,方法会打印出满足条件的时间段的开始时间。
例如,如果您想判断设备这天的工作时间是否大于等于 60 分钟,可以这样调用方法:
```java
boolean result = checker.isWorkTimeEnough(60);
```
这个方法返回一个布尔值,表示结果是 true 还是 false。如果是 true,方法会打印出满足条件的时间段的开始时间。