JAVA 需求如下: 1.有设备的日常工作时间段为字符串(HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm) 2.有这个设备工作时间段内还未工作的空闲时间段如字符串(HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm) 3.传入某工序需要的工作时间(分) 3.判断这个设备这天的剩余连续工作时段(注意:如果空闲时段包含了非工作时间,则算做连续的可用时间)是否满足工序的工作时间需要 如果满足 需要一同返回满足时段的开始时间HH:mm
时间: 2024-02-06 11:04:22 浏览: 94
JAVA基础知识。
好的,我理解了你的问题。这个问题需要编写一个 Java 函数来实现,具体的实现步骤如下:
1. 将设备的日常工作时间转换为一个时间段的列表,每个时间段包含开始时间和结束时间。可以使用 Java 中的 SimpleDateFormat 类来解析时间字符串,并使用 Calendar 类来进行日期和时间的计算。
2. 将空闲时间段转换为一个时间段的列表,每个时间段包含开始时间和结束时间。
3. 计算出设备在工作时间段内的非工作时间段,即工作时间段减去空闲时间段。如果空闲时间段包含了非工作时间,则将它们合并为连续的可用时间。
4. 遍历连续的可用时间段,判断是否满足工序的工作时间需要。如果满足,则返回满足时段的开始时间。
下面是一个可能的实现,你可以根据自己的需要进行调整和优化:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class Device {
private List<TimeRange> workTimeRanges;
private List<TimeRange> freeTimeRanges;
public Device(String workTime, String freeTime) throws ParseException {
// 将日常工作时间和空闲时间转换为时间段列表
workTimeRanges = parseTimeRanges(workTime);
freeTimeRanges = parseTimeRanges(freeTime);
}
public boolean canWork(int minutes) {
// 计算出设备在工作时间段内的非工作时间段
List<TimeRange> nonWorkTimeRanges = getNonWorkTimeRanges();
// 合并空闲时间和非工作时间,得到连续的可用时间段
List<TimeRange> availableTimeRanges = mergeTimeRanges(freeTimeRanges, nonWorkTimeRanges);
// 遍历可用时间段,判断是否满足工序的工作时间需要
for (TimeRange range : availableTimeRanges) {
if (range.getDuration() >= minutes) {
System.out.println("可以在 " + range.getStartTime() + " 开始工作");
return true;
}
}
System.out.println("无法满足工序的工作时间需要");
return false;
}
private List<TimeRange> parseTimeRanges(String timeString) throws ParseException {
List<TimeRange> ranges = new ArrayList<>();
String[] timeRanges = timeString.split(";");
for (String rangeString : timeRanges) {
String[] times = rangeString.split("-");
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
Date startTime = format.parse(times[0]);
Date endTime = format.parse(times[1]);
ranges.add(new TimeRange(startTime, endTime));
}
return ranges;
}
private List<TimeRange> getNonWorkTimeRanges() {
List<TimeRange> nonWorkTimeRanges = new ArrayList<>();
Date today = new Date();
for (TimeRange range : workTimeRanges) {
if (range.getEndTime().before(today)) {
// 如果时间段已经过去,则跳过
continue;
}
if (range.getStartTime().after(today)) {
// 如果时间段还未开始,则将整个时间段都视为非工作时间
nonWorkTimeRanges.add(range);
continue;
}
if (!freeTimeRanges.isEmpty()) {
// 如果空闲时间段不为空,则先计算出空闲时间段
nonWorkTimeRanges.addAll(getNonWorkTimeRanges(range, freeTimeRanges));
} else {
// 否则将整个工作时间段都视为可用时间
nonWorkTimeRanges.add(range);
}
}
return nonWorkTimeRanges;
}
private List<TimeRange> mergeTimeRanges(List<TimeRange> timeRanges1, List<TimeRange> timeRanges2) {
List<TimeRange> mergedTimeRanges = new ArrayList<>(timeRanges1);
mergedTimeRanges.addAll(timeRanges2);
mergedTimeRanges.sort(Comparator.comparing(TimeRange::getStartTime));
List<TimeRange> result = new ArrayList<>();
TimeRange currentRange = null;
for (TimeRange range : mergedTimeRanges) {
if (currentRange == null) {
currentRange = range;
} else if (range.getStartTime().before(currentRange.getEndTime())) {
currentRange.setEndTime(new Date(Math.max(range.getEndTime().getTime(), currentRange.getEndTime().getTime())));
} else {
result.add(currentRange);
currentRange = range;
}
}
if (currentRange != null) {
result.add(currentRange);
}
return result;
}
private List<TimeRange> getNonWorkTimeRanges(TimeRange workTimeRange, List<TimeRange> freeTimeRanges) {
List<TimeRange> nonWorkTimeRanges = new ArrayList<>();
Date startTime = workTimeRange.getStartTime();
for (TimeRange freeTimeRange : freeTimeRanges) {
if (freeTimeRange.getEndTime().before(startTime)) {
// 如果空闲时间段已经过去,则跳过
continue;
}
if (freeTimeRange.getStartTime().after(workTimeRange.getEndTime())) {
// 如果空闲时间段还未开始,则将整个工作时间段都视为非工作时间
nonWorkTimeRanges.add(workTimeRange);
break;
}
if (freeTimeRange.getStartTime().before(startTime)) {
// 如果空闲时间段的开始时间早于工作时间段的开始时间,则将空闲时间段的结束时间作为非工作时间段的开始时间
startTime = freeTimeRange.getEndTime();
} else {
// 否则将空闲时间段的开始时间作为非工作时间段的结束时间,将空闲时间段的结束时间作为下一个非工作时间段的开始时间
nonWorkTimeRanges.add(new TimeRange(startTime, freeTimeRange.getStartTime()));
startTime = freeTimeRange.getEndTime();
}
}
if (startTime.before(workTimeRange.getEndTime())) {
// 如果还有剩余的工作时间,则将剩余时间视为非工作时间
nonWorkTimeRanges.add(new TimeRange(startTime, workTimeRange.getEndTime()));
}
return nonWorkTimeRanges;
}
}
class TimeRange {
private Date startTime;
private Date endTime;
public TimeRange(Date startTime, Date endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public Date getStartTime() {
return startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
public long getDuration() {
return endTime.getTime() - startTime.getTime();
}
}
```
使用示例:
```java
public static void main(String[] args) throws ParseException {
Device device = new Device("08:00-12:00;13:00-17:00", "09:00-10:00;14:00-15:00");
device.canWork(60); // 可以在 10:00 开始工作
}
```
阅读全文