JAVA 首先 设备剩余连续工作时段可以包含非工作时间 如工作时间段为 "08:00-12:00;13:00-17:00" 空闲时间段为"11:58-12:00;13:00-13:02" 需要3分钟 则此空闲时段也算做满足需求 因为连续工作时段计算时可以包含中午休息的12:00-13:00 需求如下: 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.判断这个设备这天的剩余连续工作时段是否满足工序的工作时间需要 返回true或false,并且返回满足的最早工作时段的开始时间HH:mm
时间: 2024-01-08 14:04:20 浏览: 122
好的,根据您的需求,我可以给出以下的Java代码实现:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class DeviceWorkTime {
public static void main(String[] args) {
// 设备的日常工作时间段
List<TimeRange> workTime = new ArrayList<>();
workTime.add(new TimeRange("08:00", "12:00"));
workTime.add(new TimeRange("13:00", "17:00"));
// 设备工作时间段内还未工作的空闲时间段
List<TimeRange> freeTime = new ArrayList<>();
freeTime.add(new TimeRange("11:58", "12:00"));
freeTime.add(new TimeRange("13:00", "13:02"));
// 传入某工序需要的工作时间(分)
int workMinutes = 3;
// 判断这个设备这天的剩余连续工作时段是否满足工序的工作时间需要
boolean isSatisfied = isWorkTimeSatisfied(workTime, freeTime, workMinutes);
if (isSatisfied) {
// 返回满足的最早工作时段的开始时间HH:mm
System.out.println("满足工作时间需要,最早工作时段的开始时间为:" + getEarliestWorkStartTime(workTime, freeTime, workMinutes));
} else {
System.out.println("不满足工作时间需要");
}
}
/**
* 判断设备这天的剩余连续工作时段是否满足工序的工作时间需要
*
* @param workTime 设备的日常工作时间段
* @param freeTime 设备工作时间段内还未工作的空闲时间段
* @param workMinutes 工序需要的工作时间(分钟)
* @return 是否满足工作时间需要
*/
public static boolean isWorkTimeSatisfied(List<TimeRange> workTime, List<TimeRange> freeTime, int workMinutes) {
// 计算剩余可用工作时间(分钟)
int availableMinutes = 0;
for (TimeRange range : workTime) {
availableMinutes += range.getDuration();
}
for (TimeRange range : freeTime) {
availableMinutes += range.getDuration();
}
// 判断是否满足工作时间需要
return availableMinutes >= workMinutes;
}
/**
* 返回满足工作时间需要的最早工作时段的开始时间
*
* @param workTime 设备的日常工作时间段
* @param freeTime 设备工作时间段内还未工作的空闲时间段
* @param workMinutes 工序需要的工作时间(分钟)
* @return 满足工作时间需要的最早工作时段的开始时间(HH:mm)
*/
public static String getEarliestWorkStartTime(List<TimeRange> workTime, List<TimeRange> freeTime, int workMinutes) {
// 将所有时间段按照开始时间排序
List<TimeRange> allRanges = new ArrayList<>(workTime);
allRanges.addAll(freeTime);
allRanges.sort((r1, r2) -> r1.getStartTime().compareTo(r2.getStartTime()));
// 依次遍历每个时间段,计算是否存在满足要求的工作时间段
for (int i = 0; i < allRanges.size(); i++) {
TimeRange range = allRanges.get(i);
if (range instanceof FreeTimeRange) {
// 如果是空闲时间段,则需要将其转换为工作时间段,并计算是否满足要求
FreeTimeRange freeRange = (FreeTimeRange) range;
WorkTimeRange workRange = new WorkTimeRange(freeRange.getStartTime(), freeRange.getEndTime());
if (workRange.getDuration() >= workMinutes) {
return workRange.getStartTime();
}
} else {
// 如果是工作时间段,则需要继续向后遍历,计算是否存在满足要求的工作时间段
int totalDuration = range.getDuration();
for (int j = i + 1; j < allRanges.size(); j++) {
TimeRange nextRange = allRanges.get(j);
if (nextRange instanceof FreeTimeRange) {
// 如果是空闲时间段,则需要将其转换为工作时间段,并计算是否满足要求
FreeTimeRange freeRange = (FreeTimeRange) nextRange;
WorkTimeRange workRange = new WorkTimeRange(freeRange.getStartTime(), freeRange.getEndTime());
int duration = workRange.getDuration();
if (totalDuration + duration >= workMinutes) {
return range.getStartTime();
}
totalDuration += duration;
} else {
// 如果是工作时间段,则需要将其加入总工作时长中
WorkTimeRange workRange = (WorkTimeRange) nextRange;
totalDuration += workRange.getDuration();
}
}
if (totalDuration >= workMinutes) {
return range.getStartTime();
}
}
}
// 如果不存在满足要求的工作时间段,则返回 null
return null;
}
/**
* 时间段类
*/
public static abstract class TimeRange {
protected Date startTime;
protected Date endTime;
public TimeRange(String startTime, String endTime) {
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
try {
this.startTime = format.parse(startTime);
this.endTime = format.parse(endTime);
} catch (ParseException e) {
e.printStackTrace();
}
}
public int getDuration() {
return (int) ((endTime.getTime() - startTime.getTime()) / 1000 / 60);
}
public Date getStartTime() {
return startTime;
}
public Date getEndTime() {
return endTime;
}
}
/**
* 工作时间段类
*/
public static class WorkTimeRange extends TimeRange {
public WorkTimeRange(String startTime, String endTime) {
super(startTime, endTime);
}
}
/**
* 空闲时间段类
*/
public static class FreeTimeRange extends TimeRange {
public FreeTimeRange(String startTime, String endTime) {
super(startTime, endTime);
}
}
}
```
其中,`TimeRange`类表示一个时间段,包含开始时间和结束时间,`WorkTimeRange`表示工作时间段,`FreeTimeRange`表示空闲时间段。`isWorkTimeSatisfied`方法判断设备这天的剩余连续工作时段是否满足工序的工作时间需要,`getEarliestWorkStartTime`方法返回满足工作时间需要的最早工作时段的开始时间。这两个方法都需要传入设备的日常工作时间段和工作时间段内还未工作的空闲时间段,以及工序需要的工作时间(分钟)。
阅读全文