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-06 16:04:27 浏览: 54
JAVA判断字符串是否为数字字符
您好,根据您的需求,我可以提供以下 JAVA 代码实现:
```java
import java.time.LocalTime;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class WorkTimeChecker {
public static boolean checkWorkTime(String dailyWorkTime, String remainingWorkTime, int requiredWorkTime) {
List<LocalTime> dailyWorkTimeList = parseTimeRange(dailyWorkTime);
List<LocalTime> remainingWorkTimeList = parseTimeRange(remainingWorkTime);
int remainingWorkMinutes = remainingWorkTimeList.stream()
.mapToInt(time -> getDurationInMinutes(time, dailyWorkTimeList))
.filter(duration -> duration >= requiredWorkTime)
.findFirst()
.orElse(0);
return remainingWorkMinutes >= requiredWorkTime;
}
private static List<LocalTime> parseTimeRange(String timeRange) {
return Stream.of(timeRange.split(";"))
.flatMap(range -> {
String[] times = range.split("-");
return Stream.of(LocalTime.parse(times[0]), LocalTime.parse(times[1]));
})
.sorted()
.collect(Collectors.toList());
}
private static int getDurationInMinutes(LocalTime time, List<LocalTime> dailyWorkTimeList) {
int duration = 0;
LocalTime startTime = time;
for (LocalTime endTime : dailyWorkTimeList) {
if (endTime.isBefore(time)) {
continue;
}
int minutes = getDurationInMinutes(startTime, endTime);
duration += minutes;
startTime = endTime;
if (duration >= 24 * 60) {
break;
}
}
if (duration < 24 * 60 && startTime.isBefore(dailyWorkTimeList.get(0))) {
int minutes = getDurationInMinutes(startTime, dailyWorkTimeList.get(0));
duration += minutes;
}
return duration;
}
private static int getDurationInMinutes(LocalTime startTime, LocalTime endTime) {
int minutes = 0;
if (endTime.isBefore(startTime)) {
minutes = endTime.plusDays(1).toSecondOfDay() / 60 - startTime.toSecondOfDay() / 60;
} else {
minutes = endTime.toSecondOfDay() / 60 - startTime.toSecondOfDay() / 60;
}
return minutes;
}
public static void main(String[] args) {
String dailyWorkTime = "09:00-18:00;19:00-22:00";
String remainingWorkTime = "10:00-12:00;13:00-14:00;15:00-17:00;20:00-23:00";
int requiredWorkTime = 120;
boolean result = checkWorkTime(dailyWorkTime, remainingWorkTime, requiredWorkTime);
System.out.println(result);
}
}
```
其中,`checkWorkTime`方法接收三个参数,分别为日常工作时间段字符串、剩余可用工作时间段字符串和需要的工作时间(单位为分钟)。该方法返回一个布尔值,表示剩余可用工作时间段中是否存在满足工作时间的连续时间段。
具体实现思路如下:
1. 首先,将日常工作时间段字符串和剩余可用工作时间段字符串分别解析成时间点的列表,按照时间先后顺序排序。
2. 对于剩余可用工作时间段中的每个时间点,计算出它与日常工作时间段中的时间段重叠的时长(单位为分钟),并将这些时长相加,得到剩余可用工作时间段中连续的时间的总时长。
3. 如果总时长大于等于需要的工作时间,则返回 true,否则返回 false。
需要注意的是,为了处理跨天的情况,我们将时间点的表示方式从字符串改为了 Java8 中的 LocalTime 类。同时,对于每个时间点,我们需要计算它与日常工作时间段中的所有时间段重叠的时长,以确保没有漏掉任何时间段。
阅读全文