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.判断这个设备这天的连续剩余可工作时段是否满足工序时间(注意:如果空闲时段包含了非工作时间,则算做连续剩余可工作时段) 4.返回true和false 比如设备工作时间段是09:00-10:00;13:00-14:00 此设备这天空闲时间是09:58-10:00 13:00-13:03 某工序需要5分钟 则程序应正确返回true
时间: 2023-08-06 16:10:04 浏览: 151
好的,根据您提供的需求,我可以提供以下 JAVA 代码实现:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class DeviceWorkTime {
public static void main(String[] args) throws ParseException {
String workTimeStr = "09:00-10:00;13:00-14:00";
String freeTimeStr = "09:58-10:00;13:00-13:03";
int processTime = 5;
// 将工作时间段和空闲时间段转换成时间戳列表
List<TimeRange> workTimeList = getTimeRangeList(workTimeStr);
List<TimeRange> freeTimeList = getTimeRangeList(freeTimeStr);
// 计算连续剩余可工作时间
List<TimeRange> availableTimeList = getAvailableTimeList(workTimeList, freeTimeList);
// 判断是否满足工序时间
boolean isAvailable = checkAvailableTime(availableTimeList, processTime);
System.out.println(isAvailable);
}
// 字符串转换成时间戳列表
private static List<TimeRange> getTimeRangeList(String timeStr) throws ParseException {
List<TimeRange> timeRangeList = new ArrayList<>();
String[] timeArray = timeStr.split(";");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
for (String time : timeArray) {
String[] timeRange = time.split("-");
Date startTime = sdf.parse(timeRange[0]);
Date endTime = sdf.parse(timeRange[1]);
timeRangeList.add(new TimeRange(startTime.getTime(), endTime.getTime()));
}
return timeRangeList;
}
// 计算连续剩余可工作时间
private static List<TimeRange> getAvailableTimeList(List<TimeRange> workTimeList,
List<TimeRange> freeTimeList) {
List<TimeRange> availableTimeList = new ArrayList<>();
long startTime = workTimeList.get(0).getStartTime();
long endTime = workTimeList.get(workTimeList.size() - 1).getEndTime();
for (TimeRange freeTime : freeTimeList) {
if (freeTime.getStartTime() >= startTime && freeTime.getEndTime() <= endTime) {
// 空闲时间包含在工作时间内,需要拆分为两段
if (freeTime.getStartTime() > startTime) {
availableTimeList.add(new TimeRange(startTime, freeTime.getStartTime()));
}
startTime = freeTime.getEndTime();
}
}
if (startTime < endTime) {
availableTimeList.add(new TimeRange(startTime, endTime));
}
return availableTimeList;
}
// 判断是否满足工序时间
private static boolean checkAvailableTime(List<TimeRange> availableTimeList, int processTime) {
for (TimeRange timeRange : availableTimeList) {
if ((timeRange.getEndTime() - timeRange.getStartTime()) >= processTime * 60 * 1000) {
return true;
}
}
return false;
}
}
class TimeRange {
private long startTime;
private long endTime;
public TimeRange(long startTime, long endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public long getStartTime() {
return startTime;
}
public long getEndTime() {
return endTime;
}
}
```
其中,`getTimeRangeList`方法将时间字符串转换成时间戳列表,`getAvailableTimeList`方法计算连续剩余可工作时间,`checkAvailableTime`方法判断是否满足工序时间。
阅读全文