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) 3.传入需要的工作时间(分) 3.判断剩余所有连续可用工作时间段是否满足工作时间(注意:如可用时间段的结束时间和工作时间段的结束时间相同并且下一个可用时间段的开始时间和工作时间段的开始时间相同视为连续可用工作时间(如工作时段为08:00-09:00;13:00-15:00,可用工作时段为08:58-09:00;13:00-14:00,则此时段算作满足需求)) 4.返回true和false
时间: 2024-02-06 19:04:32 浏览: 48
好的,根据您的需求,我可以提供以下 JAVA 代码段来实现:
```java
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
public class CheckWorkTime {
/**
* 判断工作时间是否合法
* @param dailyWorkTime 日常工作时间,格式为 "HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm"
* @param availableWorkTime 剩余可用工作时间,格式为 "HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm"
* @param workTime 需要的工作时间(分)
* @return 是否合法
*/
public static boolean check(String dailyWorkTime, String availableWorkTime, int workTime) throws ParseException {
// 将工作时间段转换为时间戳列表
List<Long[]> dailyTimeList = parseTimeRange(dailyWorkTime);
List<Long[]> availableTimeList = parseTimeRange(availableWorkTime);
// 获取所有连续可用工作时间段
List<Long[]> continuousAvailableTimeList = getContinuousAvailableTimeList(availableTimeList);
// 判断是否有连续可用时间段满足需求
for (Long[] availableTime : continuousAvailableTimeList) {
long availableDuration = availableTime[1] - availableTime[0];
if (availableDuration >= workTime * 60) {
// 可用时间段大于等于需求时间
for (Long[] dailyTime : dailyTimeList) {
if (isTimeRangeOverlap(availableTime, dailyTime)) {
// 可用时间段与日常工作时间有重叠
return true;
}
}
}
}
return false;
}
/**
* 将时间段字符串转换为时间戳数组
* @param timeRangeStr 时间段字符串,格式为 "HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm"
* @return 时间戳数组
* @throws ParseException 解析异常
*/
private static List<Long[]> parseTimeRange(String timeRangeStr) throws ParseException {
List<Long[]> timeRangeList = new ArrayList<>();
String[] timeRanges = timeRangeStr.split(";");
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
for (String timeRange : timeRanges) {
String[] times = timeRange.split("-");
Long[] timeRangeArr = new Long[2];
timeRangeArr[0] = sdf.parse(times[0]).getTime();
timeRangeArr[1] = sdf.parse(times[1]).getTime();
timeRangeList.add(timeRangeArr);
}
return timeRangeList;
}
/**
* 获取所有连续可用工作时间段
* @param availableTimeList 可用工作时间列表
* @return 连续可用工作时间段列表
*/
private static List<Long[]> getContinuousAvailableTimeList(List<Long[]> availableTimeList) {
List<Long[]> continuousTimeList = new ArrayList<>();
Collections.sort(availableTimeList, Comparator.comparingLong(arr -> arr[0]));
int i = 0, j = 0;
while (i < availableTimeList.size()) {
Long[] timeRange = availableTimeList.get(i);
long endTime = timeRange[1];
j = i + 1;
while (j < availableTimeList.size() && availableTimeList.get(j)[0] <= endTime) {
endTime = Math.max(endTime, availableTimeList.get(j)[1]);
j++;
}
continuousTimeList.add(new Long[]{timeRange[0], endTime});
i = j;
}
return continuousTimeList;
}
/**
* 判断两个时间段是否有重叠部分
* @param timeRange1 时间段1
* @param timeRange2 时间段2
* @return 是否重叠
*/
private static boolean isTimeRangeOverlap(Long[] timeRange1, Long[] timeRange2) {
return timeRange1[0] <= timeRange2[1] && timeRange1[1] >= timeRange2[0];
}
public static void main(String[] args) throws ParseException {
String dailyWorkTime = "08:00-09:00;13:00-15:00";
String availableWorkTime = "08:58-09:00;13:00-14:00";
int workTime = 60;
boolean result = check(dailyWorkTime, availableWorkTime, workTime);
System.out.println(result);
}
}
```
您可以将此代码段复制到您的项目中,并根据需要进行调整和优化。
阅读全文