上班时间:9:00-12:00 (3小时), 午休:12:00-14:00 (不计入), 下午上班时间14:00-18:30(4.5小时), 入参:开始时间(yyyy-MM-dd hh:mm:ss)、结束时间(yyyy-MM-dd hh:mm:ss) 要支持跨天算工时
时间: 2024-12-02 07:12:11 浏览: 5
i18nize-react:在午休时间对应用程序进行国际化
上班时间的计算通常涉及到日期和时间的处理。给定的上下班时间和午休时间,你可以编写一个函数来计算工作日内的实际工时。这个函数会接收开始时间和结束时间作为输入,然后按以下步骤操作:
1. 将两个输入的时间字符串转换为`LocalDateTime`对象,以便于比较和计算。
2. 分别获取每天的开始和结束时间点(不包括午休)。
3. 检查开始时间是否在有效的工作时间内,如果是,则从开始时间到当天结束时间的差值即为当天的工时。
4. 如果开始时间跨过两天(比如第二天早上),需要分别计算前一天和当天的工时。前一天下午的下班时间减去开始时间,再加上第二天上午的工作时间。
5. 计算结束后,将所有天数的工作时间累加起来。
以下是伪代码示例:
```java
LocalDateTime startOfDay = LocalDateTime.of(startDate, LocalTime.MIDNIGHT);
LocalDateTime endOfDay = LocalDateTime.of(startDate, LocalTime.of(18, 30));
LocalDateTime startGiven = LocalDateTime.parse(startInput);
LocalDateTime endGiven = LocalDateTime.parse(endInput);
LocalDateTime workingStart = startGiven.minusMinutes(startGiven.minute() % 60); // 调整至半点
LocalDateTime workingEnd = endGiven;
// 总工时
long totalHours = 0;
if (startGiven.isBefore(startOfDay)) {
long prevDayWorkingHours = calculateWorkedHours(startGiven, startOfDay, endOfDay);
totalHours += prevDayWorkingHours;
if (!endGiven.isAfter(endOfDay)) { // 如果没跨天
totalHours += calculateWorkedHours(workingStart, endGiven, endOfDay);
} else { // 跨天
LocalTime nextDayStart = LocalTime.of(9, 0);
LocalDate nextDay = startGiven.plusDays(1);
totalHours += calculateWorkedHours(workingStart, endOfDay, nextDay.atTime(nextDayStart));
totalHours += calculateWorkedHours(LocalDateTime.of(nextDay, startOfDay), endGiven, endOfDay);
}
} else {
totalHours += calculateWorkedHours(startGiven, endGiven, endOfDay);
}
public long calculateWorkedHours(LocalDateTime start, LocalDateTime end, LocalDateTime dayEnd) {
return ChronoUnit.MINUTES.between(start, Math.min(end, dayEnd)).divide(60);
}
```
阅读全文