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.判断可用工作时间段的时间是否满足需要工作时间(可用时间段的时间计算时 时间段必须对工作时间来说是连续的,两个可用时间段中的时间包含非工作时间时 则这两个时间段算是连续的) 4.返回true和false
时间: 2024-02-11 16:08:34 浏览: 68
好的,根据您的需求,我可以给出以下 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 DeviceWorkTimeChecker {
private static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm");
/**
* 判断设备的工作时间是否满足某工序的需求
*
* @param dailyWorkTimeStr 日常工作时间段字符串,格式为HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm
* @param availableTimeStr 剩余可用工作时间段字符串,格式同dailyWorkTimeStr
* @param requiredMinutes 需要的工作时间(分)
* @return 可用工作时间是否满足需要工作时间
*/
public static boolean isWorkTimeSufficient(String dailyWorkTimeStr, String availableTimeStr, int requiredMinutes) {
List<TimeRange> dailyWorkTime = parseTimeRanges(dailyWorkTimeStr);
List<TimeRange> availableTime = parseTimeRanges(availableTimeStr);
// 将日常工作时间和可用工作时间合并为连续的时间段
List<TimeRange> mergedTimeRanges = mergeTimeRanges(dailyWorkTime, availableTime);
// 计算所有连续时间段的总时长
int totalMinutes = 0;
for (TimeRange timeRange : mergedTimeRanges) {
totalMinutes += timeRange.getDuration();
}
return totalMinutes >= requiredMinutes;
}
/**
* 解析时间段字符串,返回时间段列表
*
* @param timeRangeStr 时间段字符串,格式为HH:mm-HH:mm;HH:mm-HH:mm;HH:mm-HH:mm
* @return 时间段列表
*/
private static List<TimeRange> parseTimeRanges(String timeRangeStr) {
String[] timeRanges = timeRangeStr.split(";");
List<TimeRange> result = new ArrayList<>(timeRanges.length);
for (String timeRange : timeRanges) {
String[] startEnd = timeRange.split("-");
try {
Date startDate = TIME_FORMAT.parse(startEnd[0]);
Date endDate = TIME_FORMAT.parse(startEnd[1]);
result.add(new TimeRange(startDate, endDate));
} catch (ParseException e) {
// 时间解析失败,忽略该时间段
}
}
return result;
}
/**
* 合并时间段列表,返回连续的时间段列表
*
* @param timeRanges1 时间段列表1
* @param timeRanges2 时间段列表2
* @return 连续的时间段列表
*/
private static List<TimeRange> mergeTimeRanges(List<TimeRange> timeRanges1, List<TimeRange> timeRanges2) {
List<TimeRange> allTimeRanges = new ArrayList<>(timeRanges1.size() + timeRanges2.size());
allTimeRanges.addAll(timeRanges1);
allTimeRanges.addAll(timeRanges2);
List<TimeRange> mergedTimeRanges = new ArrayList<>();
// 按照开始时间排序
allTimeRanges.sort((range1, range2) -> range1.getStartTime().compareTo(range2.getStartTime()));
TimeRange currentRange = null;
for (TimeRange timeRange : allTimeRanges) {
if (currentRange == null) {
currentRange = timeRange;
} else {
if (timeRange.getStartTime().getTime() <= currentRange.getEndTime().getTime()) {
// 两个时间段有交集,合并为一个时间段
currentRange.setEndTime(timeRange.getEndTime());
} else {
// 两个时间段不连续,将上一个连续时间段加入列表
mergedTimeRanges.add(currentRange);
currentRange = timeRange;
}
}
}
if (currentRange != null) {
// 将最后一个连续时间段加入列表
mergedTimeRanges.add(currentRange);
}
return mergedTimeRanges;
}
/**
* 表示一个时间段的开始和结束时间
*/
private static class TimeRange {
private Date startTime;
private Date endTime;
public TimeRange(Date startTime, Date endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public Date getStartTime() {
return startTime;
}
public void setStartTime(Date startTime) {
this.startTime = startTime;
}
public Date getEndTime() {
return endTime;
}
public void setEndTime(Date endTime) {
this.endTime = endTime;
}
/**
* 获取时间段的时长(分钟)
*
* @return 时间段的时长(分钟)
*/
public int getDuration() {
return (int) ((endTime.getTime() - startTime.getTime()) / 60000);
}
}
}
```
使用示例:
```java
public class Main {
public static void main(String[] args) {
// 日常工作时间为8:00-12:00,13:00-17:00
String dailyWorkTimeStr = "08:00-12:00;13:00-17:00";
// 可用工作时间为8:00-12:00,14:00-16:00
String availableTimeStr = "08:00-12:00;14:00-16:00";
// 需要工作时间为120分钟
int requiredMinutes = 120;
boolean isSufficient = DeviceWorkTimeChecker.isWorkTimeSufficient(dailyWorkTimeStr, availableTimeStr, requiredMinutes);
System.out.println("可用工作时间是否满足需要工作时间:" + isSufficient);
}
}
```
输出结果为:
```
可用工作时间是否满足需要工作时间:true
```
注意:这段代码中的 `TimeRange` 类只是为了方便表示时间段而创建的,实际应用中可能需要使用更加严谨和全面的时间表示方式。另外,这段代码还有一些限制和不足之处,例如无法处理跨天的时间段,无法处理夏令时等问题,需要根据实际情况进行调整和改进。
阅读全文