java 传入时间段列表(格式为hh:mm-hh:mm) 计算给定分钟后的日期时间 只考虑工作时段
时间: 2023-12-14 15:35:52 浏览: 129
可以通过以下步骤实现:
1. 将时间段列表转换为开始时间和结束时间的列表,即将 "hh:mm-hh:mm" 格式的字符串转换为两个 LocalTime 对象。
2. 计算给定分钟数对应的时间量,例如 90 分钟等于 1 小时 30 分钟。
3. 获取当前日期和时间的 LocalDateTime 对象。
4. 判断当前时间是否处于工作时段内,如果不是,则将当前时间设置为当天的工作开始时间。
5. 循环遍历工作时段列表,找到下一个可用的时间段,即开始时间在当前时间之后且结束时间在当前时间加上给定分钟数之后。
6. 如果找到可用的时间段,则将当前时间设置为该时间段的开始时间加上给定分钟数的时间,然后退出循环。
7. 如果没有找到可用的时间段,则将当前时间设置为当天的工作开始时间加上给定分钟数的时间,并将日期加一天。
8. 返回计算后的日期时间。
下面是 Java 代码示例:
```java
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class DateTimeUtils {
private static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern("HH:mm");
/**
* 计算给定分钟数后的日期时间
*
* @param minutes 给定分钟数
* @param workTimeList 工作时间段列表,格式为 "hh:mm-hh:mm"
* @return 计算后的日期时间
*/
public static LocalDateTime calculateDateTimeAfterMinutes(int minutes, List<String> workTimeList) {
// 将时间段列表转换为开始时间和结束时间的列表
List<LocalTime> startTimeList = workTimeList.stream().map(s -> s.split("-")[0]).map(LocalTime::parse).collect(Collectors.toList());
List<LocalTime> endTimeList = workTimeList.stream().map(s -> s.split("-")[1]).map(LocalTime::parse).collect(Collectors.toList());
// 计算给定分钟数对应的时间量
Duration duration = Duration.ofMinutes(minutes);
// 获取当前日期和时间的 LocalDateTime 对象
LocalDateTime now = LocalDateTime.now();
// 判断当前时间是否处于工作时段内,如果不是,则将当前时间设置为当天的工作开始时间
boolean isInWorkTime = false;
for (int i = 0; i < startTimeList.size(); i++) {
if (now.toLocalTime().isBefore(startTimeList.get(i))) {
now = LocalDateTime.of(now.toLocalDate(), startTimeList.get(i));
isInWorkTime = true;
break;
} else if (now.toLocalTime().isAfter(startTimeList.get(i)) && now.toLocalTime().isBefore(endTimeList.get(i))) {
isInWorkTime = true;
break;
}
}
if (!isInWorkTime) {
now = LocalDateTime.of(now.toLocalDate(), startTimeList.get(0));
}
// 循环遍历工作时段列表,找到下一个可用的时间段
boolean found = false;
for (int i = 0; i < startTimeList.size(); i++) {
if (startTimeList.get(i).isAfter(now.toLocalTime())) {
LocalDateTime start = LocalDateTime.of(now.toLocalDate(), startTimeList.get(i));
LocalDateTime end = LocalDateTime.of(now.toLocalDate(), endTimeList.get(i));
if (start.plus(duration).isBefore(end)) {
now = start.plus(duration);
found = true;
break;
}
}
}
// 如果没有找到可用的时间段,则将当前时间设置为当天的工作开始时间加上给定分钟数的时间,并将日期加一天
if (!found) {
now = LocalDateTime.of(now.toLocalDate().plusDays(1), startTimeList.get(0)).plus(duration);
}
return now;
}
public static void main(String[] args) {
// 测试代码
List<String> workTimeList = Stream.of("09:00-12:00", "13:00-18:00").collect(Collectors.toList());
LocalDateTime dateTime = calculateDateTimeAfterMinutes(90, workTimeList);
String formattedDateTime = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
System.out.println(formattedDateTime); // 输出示例:2021-10-01 10:30:00
}
}
```
阅读全文