java 给定工作时间段(可以有多个) 计算某分钟数后的日期时间 可跨天
时间: 2023-12-10 16:42:40 浏览: 88
计算某时间段内的工作日及时间
可以使用 Java 中的 `LocalDateTime` 和 `Duration` 来计算某分钟数后的日期时间,代码示例如下:
```java
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Duration;
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
List<TimeRange> workTimes = new ArrayList<>();
workTimes.add(new TimeRange(LocalTime.of(9, 0), LocalTime.of(12, 0)));
workTimes.add(new TimeRange(LocalTime.of(13, 0), LocalTime.of(18, 0)));
LocalDateTime startDateTime = LocalDateTime.now();
int minutesToAdd = 120;
LocalDateTime resultDateTime = addMinutesToDateTime(startDateTime, minutesToAdd, workTimes);
System.out.println("Start DateTime: " + startDateTime);
System.out.println("Minutes to add: " + minutesToAdd);
System.out.println("Result DateTime: " + resultDateTime);
}
public static LocalDateTime addMinutesToDateTime(LocalDateTime dateTime, int minutesToAdd, List<TimeRange> workTimes) {
LocalDateTime resultDateTime = dateTime;
while (minutesToAdd > 0) {
// 计算当前时间在工作时间段中的哪个时间段
int timeRangeIndex = -1;
for (int i = 0; i < workTimes.size(); i++) {
if (workTimes.get(i).contains(resultDateTime.toLocalTime())) {
timeRangeIndex = i;
break;
}
}
// 如果当前时间在工作时间内,则可以加上分钟数
if (timeRangeIndex != -1) {
LocalTime endTime = workTimes.get(timeRangeIndex).getEndTime();
LocalDateTime endDateTime = LocalDateTime.of(resultDateTime.toLocalDate(), endTime);
Duration remainingTime = Duration.between(resultDateTime, endDateTime);
if (remainingTime.toMinutes() >= minutesToAdd) {
resultDateTime = resultDateTime.plusMinutes(minutesToAdd);
minutesToAdd = 0;
} else {
resultDateTime = endDateTime;
minutesToAdd -= remainingTime.toMinutes();
}
}
// 如果当前时间在工作时间外,则转到下一个工作时间段的开始时间
else {
LocalTime nextStartTime = getNextStartTime(resultDateTime.toLocalTime(), workTimes);
resultDateTime = LocalDateTime.of(resultDateTime.toLocalDate().plusDays(1), nextStartTime);
}
}
return resultDateTime;
}
// 获取下一个工作时间段的开始时间
public static LocalTime getNextStartTime(LocalTime time, List<TimeRange> workTimes) {
for (TimeRange tr : workTimes) {
if (tr.getStartTime().isAfter(time)) {
return tr.getStartTime();
}
}
return workTimes.get(0).getStartTime();
}
}
class TimeRange {
private LocalTime startTime;
private LocalTime endTime;
public TimeRange(LocalTime startTime, LocalTime endTime) {
this.startTime = startTime;
this.endTime = endTime;
}
public boolean contains(LocalTime time) {
return !time.isBefore(startTime) && !time.isAfter(endTime);
}
public LocalTime getStartTime() {
return startTime;
}
public LocalTime getEndTime() {
return endTime;
}
}
```
在上面的代码中,`addMinutesToDateTime` 方法接受一个 `LocalDateTime` 对象、一个分钟数和一个工作时间段列表,返回加上指定分钟数后的日期时间。该方法使用循环来逐步增加分钟数,直到达到指定分钟数为止。在每个循环迭代中,首先计算当前时间在工作时间段中的哪个时间段,如果当前时间在工作时间内,则可以加上指定分钟数;否则,转到下一个工作时间段的开始时间。`getNextStartTime` 方法用于获取下一个工作时间段的开始时间。
阅读全文