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.判断这个设备这天的剩余连续工作时段是否满足工序的工作时间需要 返回true或false 注意 连续工作时段包含午休时间
时间: 2024-02-02 19:04:25 浏览: 64
好的,根据您的需求,我可以为您提供以下Java代码示例:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DeviceWorkingTime {
// 定义设备工作日常时间段列表
private List<TimePeriod> dailyWorkingTimeList;
// 定义设备工作时间段内未工作的空闲时间段列表
private List<TimePeriod> freeTimeList;
// 定义午休时间段
private TimePeriod lunchBreak = new TimePeriod("12:00-13:00");
public DeviceWorkingTime(String dailyWorkingTimeStr, String freeTimeStr) {
// 解析设备工作日常时间段字符串,生成时间段列表
this.dailyWorkingTimeList = parseTimePeriodStr(dailyWorkingTimeStr);
// 解析设备工作时间段内未工作的空闲时间段字符串,生成时间段列表
this.freeTimeList = parseTimePeriodStr(freeTimeStr);
}
// 判断设备是否能够工作指定的时长(单位:分)
public boolean canWorkForMinutes(int minutes) {
// 计算设备当天可连续工作时间段列表
List<TimePeriod> continuousWorkingTimeList = getContinuousWorkingTimeList();
for (TimePeriod timePeriod : continuousWorkingTimeList) {
if (timePeriod.getDuration() >= minutes) {
// 如果存在可用于工作的连续时间段,则返回true
return true;
}
}
// 如果不存在可用于工作的连续时间段,则返回false
return false;
}
// 获取设备当天可用于连续工作的时间段列表(包括午休时间)
private List<TimePeriod> getContinuousWorkingTimeList() {
List<TimePeriod> continuousWorkingTimeList = new ArrayList<>();
// 遍历设备工作日常时间段列表
for (TimePeriod dailyWorkingTime : dailyWorkingTimeList) {
// 遍历设备工作时间段内未工作的空闲时间段列表
for (TimePeriod freeTime : freeTimeList) {
// 判断设备工作时间段内未工作的空闲时间段是否与设备工作日常时间段重叠
if (dailyWorkingTime.isOverlap(freeTime)) {
// 计算可用于连续工作的时间段
TimePeriod continuousWorkingTime = dailyWorkingTime.getIntersection(freeTime);
// 判断连续工作时间段是否包含午休时间段
if (continuousWorkingTime.isOverlap(lunchBreak)) {
// 如果连续工作时间段包含午休时间段,则分割成两个时间段
List<TimePeriod> splitTimeList = continuousWorkingTime.split(lunchBreak);
// 将午休时间段之前的时间段添加到连续工作时间段列表中
continuousWorkingTimeList.add(splitTimeList.get(0));
} else {
// 如果连续工作时间段不包含午休时间段,则直接添加到连续工作时间段列表中
continuousWorkingTimeList.add(continuousWorkingTime);
}
}
}
}
return continuousWorkingTimeList;
}
// 解析时间段字符串,返回时间段列表
private List<TimePeriod> parseTimePeriodStr(String timePeriodStr) {
List<TimePeriod> timePeriodList = new ArrayList<>();
String[] timePeriodArray = timePeriodStr.split(";");
for (String timePeriod : timePeriodArray) {
timePeriodList.add(new TimePeriod(timePeriod));
}
return timePeriodList;
}
// 时间段类
private static class TimePeriod {
private Date startTime;
private Date endTime;
public TimePeriod(String timePeriodStr) {
String[] timeArray = timePeriodStr.split("-");
SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm");
try {
this.startTime = dateFormat.parse(timeArray[0]);
this.endTime = dateFormat.parse(timeArray[1]);
} catch (ParseException e) {
e.printStackTrace();
}
}
public boolean isOverlap(TimePeriod other) {
return !(this.startTime.after(other.endTime) || other.startTime.after(this.endTime));
}
public TimePeriod getIntersection(TimePeriod other) {
Date newStartTime = this.startTime.after(other.startTime) ? this.startTime : other.startTime;
Date newEndTime = this.endTime.before(other.endTime) ? this.endTime : other.endTime;
return new TimePeriod(dateFormat.format(newStartTime) + "-" + dateFormat.format(newEndTime));
}
public List<TimePeriod> split(TimePeriod other) {
List<TimePeriod> timePeriodList = new ArrayList<>();
if (this.isOverlap(other)) {
if (this.startTime.before(other.startTime)) {
timePeriodList.add(new TimePeriod(dateFormat.format(this.startTime) + "-" + dateFormat.format(other.startTime)));
}
if (this.endTime.after(other.endTime)) {
timePeriodList.add(new TimePeriod(dateFormat.format(other.endTime) + "-" + dateFormat.format(this.endTime)));
}
} else {
timePeriodList.add(this);
}
return timePeriodList;
}
public int getDuration() {
return (int) ((endTime.getTime() - startTime.getTime()) / (1000 * 60));
}
}
}
```
使用示例:
```java
public static void main(String[] args) {
// 创建设备工作时间对象
DeviceWorkingTime deviceWorkingTime = new DeviceWorkingTime("08:00-12:00;13:00-17:00", "09:00-10:00;14:00-15:00");
// 判断设备是否能够工作60分钟
boolean canWork = deviceWorkingTime.canWorkForMinutes(60);
System.out.println(canWork ? "设备能够工作60分钟" : "设备不能工作60分钟");
}
```
输出结果:
```
设备能够工作60分钟
```
注意:以上代码仅为示例,实际使用时需要根据具体情况进行修改和优化。
阅读全文