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,并且返回满足的最早工作时段的开始时间HH:mm 注意 剩余可工作时间必须是连续的(可以包含休息时间) 如工作时间段为 "08:00-12:00;13:00-17:00" 空闲时间段为"11:58-12:00;13:00-13:02" 所需时间为3分钟 则返回true和开始时间为11:58
时间: 2024-02-05 08:04:22 浏览: 160
JAVA实现按时间段查询数据操作
好的,根据您的要求,我可以提供以下Java代码实现:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public class DeviceWorkingTime {
// 将时间字符串转换为Date类型
public static Date stringToDate(String timeStr) throws ParseException {
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
return format.parse(timeStr);
}
// 计算两个时间之间的时间差(单位:分钟)
public static int getTimeInterval(String startTimeStr, String endTimeStr) throws ParseException {
Date startTime = stringToDate(startTimeStr);
Date endTime = stringToDate(endTimeStr);
long timeInterval = endTime.getTime() - startTime.getTime();
return (int)(timeInterval / (1000 * 60));
}
// 判断某个时间段是否包含在另一个时间段内
public static boolean isTimeIntervalContained(String startTimeStr1, String endTimeStr1,
String startTimeStr2, String endTimeStr2) throws ParseException {
Date startTime1 = stringToDate(startTimeStr1);
Date endTime1 = stringToDate(endTimeStr1);
Date startTime2 = stringToDate(startTimeStr2);
Date endTime2 = stringToDate(endTimeStr2);
return (startTime1.compareTo(startTime2) >= 0 && endTime1.compareTo(endTime2) <= 0);
}
// 判断某个时间段是否与另一个时间段有重叠
public static boolean isTimeIntervalOverlapped(String startTimeStr1, String endTimeStr1,
String startTimeStr2, String endTimeStr2) throws ParseException {
Date startTime1 = stringToDate(startTimeStr1);
Date endTime1 = stringToDate(endTimeStr1);
Date startTime2 = stringToDate(startTimeStr2);
Date endTime2 = stringToDate(endTimeStr2);
return (startTime1.compareTo(endTime2) < 0 && endTime1.compareTo(startTime2) > 0);
}
// 获取剩余可工作时间段列表
public static ArrayList<String[]> getRemainingWorkingTime(String workingTimeStr, String idleTimeStr) throws ParseException {
ArrayList<String[]> remainingWorkingTime = new ArrayList<>();
String[] workingTimeArr = workingTimeStr.split(";");
String[] idleTimeArr = idleTimeStr.split(";");
// 将工作时间段加入列表
for (String timeInterval : workingTimeArr) {
String[] timeArr = timeInterval.split("-");
remainingWorkingTime.add(timeArr);
}
// 将空闲时间段从列表中去除
for (String idleInterval : idleTimeArr) {
String[] idleArr = idleInterval.split("-");
for (int i = 0; i < remainingWorkingTime.size(); i++) {
String[] workingArr = remainingWorkingTime.get(i);
if (isTimeIntervalContained(idleArr[0], idleArr[1], workingArr[0], workingArr[1])) {
// 空闲时间段包含了整个工作时间段,直接删除
remainingWorkingTime.remove(i);
break;
} else if (isTimeIntervalOverlapped(idleArr[0], idleArr[1], workingArr[0], workingArr[1])) {
// 空闲时间段与工作时间段有重叠,分割工作时间段并删除重叠部分
String[] newWorkingArr1 = {workingArr[0], idleArr[0]};
String[] newWorkingArr2 = {idleArr[1], workingArr[1]};
if (newWorkingArr1[0].compareTo(newWorkingArr1[1]) < 0) {
remainingWorkingTime.set(i, newWorkingArr1);
i++;
}
if (newWorkingArr2[0].compareTo(newWorkingArr2[1]) < 0) {
remainingWorkingTime.add(i, newWorkingArr2);
}
remainingWorkingTime.remove(i);
break;
}
}
}
return remainingWorkingTime;
}
// 判断剩余可工作时间是否满足工序的工作时间需要
public static boolean checkRemainingWorkingTime(String remainingWorkingTimeStr, int requiredTime) throws ParseException {
ArrayList<String[]> remainingWorkingTime = getRemainingWorkingTime(remainingWorkingTimeStr, "");
for (String[] timeArr : remainingWorkingTime) {
int timeInterval = getTimeInterval(timeArr[0], timeArr[1]);
if (timeInterval >= requiredTime) {
return true;
}
}
return false;
}
// 获取满足的最早工作时段的开始时间
public static String getEarliestStartTime(String remainingWorkingTimeStr, int requiredTime) throws ParseException {
ArrayList<String[]> remainingWorkingTime = getRemainingWorkingTime(remainingWorkingTimeStr, "");
for (String[] timeArr : remainingWorkingTime) {
int timeInterval = getTimeInterval(timeArr[0], timeArr[1]);
if (timeInterval >= requiredTime) {
return timeArr[0];
}
}
return "";
}
public static void main(String[] args) throws ParseException {
String workingTimeStr = "08:00-12:00;13:00-17:00";
String idleTimeStr = "11:58-12:00;13:00-13:02";
int requiredTime = 3;
String remainingWorkingTimeStr = "";
ArrayList<String[]> remainingWorkingTime = getRemainingWorkingTime(workingTimeStr, idleTimeStr);
for (String[] timeArr : remainingWorkingTime) {
remainingWorkingTimeStr += timeArr[0] + "-" + timeArr[1] + ";";
}
remainingWorkingTimeStr = remainingWorkingTimeStr.substring(0, remainingWorkingTimeStr.length() - 1);
boolean isSatisfied = checkRemainingWorkingTime(remainingWorkingTimeStr, requiredTime);
if (isSatisfied) {
String earliestStartTime = getEarliestStartTime(remainingWorkingTimeStr, requiredTime);
System.out.println("剩余可工作时间是否满足工序的工作时间需要:" + isSatisfied);
System.out.println("满足的最早工作时段的开始时间:" + earliestStartTime);
} else {
System.out.println("剩余可工作时间不满足工序的工作时间需要");
}
}
}
```
您可以将传入设备的日常工作时间段、传入这个设备工作时间段内还未工作的空闲时间段和某工序需要的工作时间作为参数传入 `getRemainingWorkingTime()` 方法和 `checkRemainingWorkingTime()` 方法中,然后可以得到剩余可工作时间段列表和判断剩余可工作时间是否满足工序的工作时间需要的结果。最后,可以调用 `getEarliestStartTime()` 方法获取满足的最早工作时段的开始时间。
注意,本代码实现中,假设传入的时间段是合法的,即开始时间早于结束时间。如果需要考虑非法输入的情况,需要进行相应的处理。
阅读全文