java 给定工作时间段(可以有三个时间段或无数个时间段) 计算给定分钟后的日期时间 只考虑工作时段
时间: 2023-12-14 16:35:45 浏览: 81
可以通过以下步骤来计算给定分钟后的工作时间:
1. 将给定日期时间转换为分钟数表示。
2. 根据给定的工作时间段,确定起始时间和结束时间,并将它们转换为分钟数表示。
3. 计算给定分钟数与起始时间的时间差。
4. 如果时间差小于等于 0,则说明给定时间在工作时间段的开始之前,直接返回工作时间段的起始时间。
5. 如果时间差大于等于工作时间段的时长,则说明给定时间在工作时间段的结束之后,需要递归地计算下一个工作时间段的起始时间。
6. 如果时间差在工作时间段内,则说明给定时间在工作时间段内,计算给定时间与起始时间的时间差,然后加上起始时间即可得到计算后的日期时间。
以下是 Java 代码示例,其中假设工作时间段为 9:00 - 12:00 和 13:30 - 18:00,每个工作日的工作时间为 8.5 小时:
```java
import java.time.DayOfWeek;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.LocalTime;
public class WorkTimeCalculator {
private static final LocalTime START_TIME_1 = LocalTime.of(9, 0);
private static final LocalTime END_TIME_1 = LocalTime.of(12, 0);
private static final LocalTime START_TIME_2 = LocalTime.of(13, 30);
private static final LocalTime END_TIME_2 = LocalTime.of(18, 0);
private static final Duration WORK_TIME = Duration.ofHours(8).plusMinutes(30);
public static LocalDateTime calculate(LocalDateTime dateTime, long minutes) {
LocalDateTime result = null;
int days = 0;
long remainingMinutes = minutes;
while (remainingMinutes > 0) {
LocalDateTime startDateTime = dateTime.with(LocalTime.MIN);
LocalDateTime endDateTime = dateTime.with(LocalTime.MAX);
LocalTime startTime = getStartTime(startDateTime);
LocalTime endTime = getEndTime(endDateTime);
if (startTime == null || endTime == null) {
break;
}
long diffMinutes = Duration.between(startTime, dateTime.toLocalTime()).toMinutes();
if (diffMinutes <= 0) {
remainingMinutes -= diffMinutes;
result = startDateTime.plusMinutes(remainingMinutes);
break;
}
long workMinutes = Duration.between(startTime, endTime).toMinutes();
if (remainingMinutes >= workMinutes) {
remainingMinutes -= workMinutes;
dateTime = endDateTime.plusDays(1).withHour(START_TIME_1.getHour()).withMinute(START_TIME_1.getMinute());
days++;
} else {
result = dateTime.plusMinutes(remainingMinutes);
break;
}
}
return result;
}
private static LocalTime getStartTime(LocalDateTime dateTime) {
DayOfWeek dayOfWeek = dateTime.getDayOfWeek();
LocalTime startTime = null;
if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) {
if (dateTime.toLocalTime().isBefore(START_TIME_1)) {
startTime = START_TIME_1;
} else if (dateTime.toLocalTime().isBefore(END_TIME_1)) {
startTime = dateTime.toLocalTime();
} else if (dateTime.toLocalTime().isBefore(START_TIME_2)) {
startTime = START_TIME_2;
} else if (dateTime.toLocalTime().isBefore(END_TIME_2)) {
startTime = dateTime.toLocalTime();
}
}
return startTime;
}
private static LocalTime getEndTime(LocalDateTime dateTime) {
DayOfWeek dayOfWeek = dateTime.getDayOfWeek();
LocalTime endTime = null;
if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) {
if (dateTime.toLocalTime().isAfter(END_TIME_2)) {
endTime = END_TIME_2;
} else if (dateTime.toLocalTime().isAfter(START_TIME_2)) {
endTime = dateTime.toLocalTime();
} else if (dateTime.toLocalTime().isAfter(END_TIME_1)) {
endTime = END_TIME_1;
} else if (dateTime.toLocalTime().isAfter(START_TIME_1)) {
endTime = dateTime.toLocalTime();
}
}
return endTime;
}
}
```
使用示例:
```java
LocalDateTime dateTime = LocalDateTime.of(2021, 8, 31, 16, 0);
long minutes = 90;
LocalDateTime result = WorkTimeCalculator.calculate(dateTime, minutes);
System.out.println(result); // 2021-09-01T09:30
```
在上面的示例中,给定的日期时间为 2021 年 8 月 31 日 16:00,需要计算 90 分钟后的工作时间。根据工作时间段的定义,计算结果应该是 2021 年 9 月 1 日 9:30。
阅读全文