请假申请时提供一个开始和结束时间,计算这段时间内的上班时间为多少个小时
/**
* 计算请假时长,周日不计算
* @param startTimeStr
* @param endTimeStr
* @return
*/
public double computeWorkTimeLength(String startTimeStr, String endTimeStr){
// 获取配置的上班时间、下班时间、午休时间
// String workTimeStart = configService.selectConfigByKey("work.time.start");
String workTimeStart = "08:30";
// String workTimeEnd = configService.selectConfigByKey("pm.rest.time.start");
String workTimeEnd = "18:00";
// String noonRestTimeStart = configService.selectConfigByKey("noon.rest.time.start");
String noonRestTimeStart = "11:40";
// String noonRestTimeEnd = configService.selectConfigByKey("noon.rest.time.end");
String noonRestTimeEnd = "14:00";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
// 将字符串转换为 LocalDateTime 对象
LocalDateTime startTime = LocalDateTime.parse(startTimeStr, formatter);
LocalDateTime endTime = LocalDateTime.parse(endTimeStr, formatter);
// 定义上班时间和下班时间
LocalTime workStartTime = LocalTime.parse(workTimeStart);
LocalTime workEndTime = LocalTime.parse(workTimeEnd);
// 定义午休时间
LocalTime wxStartTime = LocalTime.parse(noonRestTimeStart);
LocalTime wxEndTime = LocalTime.parse(noonRestTimeEnd);
double totalLeaveHours = 0;
LocalDate currentDate = startTime.toLocalDate();
while (currentDate.isBefore(endTime.toLocalDate()) || currentDate.isEqual(endTime.toLocalDate())) {
// 排除周日
if (currentDate.getDayOfWeek() != DayOfWeek.SUNDAY) {
LocalTime currentDayStartTime = (currentDate.isEqual(startTime.toLocalDate())) ? startTime.toLocalTime() : workStartTime;
LocalTime currentDayEndTime = (currentDate.isEqual(endTime.toLocalDate())) ? endTime.toLocalTime() : workEndTime;
if (currentDayStartTime.isAfter(currentDayEndTime)) {
currentDayStartTime = workStartTime;
currentDayEndTime = workEndTime;
}
// 排除午休时间
if (!currentDayStartTime.isAfter(wxEndTime) && !currentDayEndTime.isBefore(wxStartTime)) {
// 午休时间包含在调休时间内
long workMinutesBeforeRest = Duration.between(currentDayStartTime, wxStartTime).toMinutes();
long workMinutesAfterRest = Duration.between(wxEndTime, currentDayEndTime).toMinutes();
long totalWorkMinutes = workMinutesBeforeRest + workMinutesAfterRest;
// return totalWorkMinutes / 60.0;
totalLeaveHours += Math.max(totalWorkMinutes / 60.0, 0);
} else {
// 午休时间不包含在调休时间内
long currentDayWorkMinutes = Duration.between(currentDayStartTime, currentDayEndTime).toMinutes();
// return currentDayWorkMinutes / 60.0;
totalLeaveHours += Math.max(currentDayWorkMinutes / 60.0, 0);
}
// long currentDayWorkMinutes = Duration.between(currentDayStartTime, currentDayEndTime).toMinutes() - Duration.between(wxStartTime, wxEndTime).toMinutes();
// totalLeaveHours += Math.max(currentDayWorkMinutes / 60.0, 0);
}
currentDate = currentDate.plusDays(1);
}
// 返回时间,并保留两位小数
return Math.round(totalLeaveHours * 100.0) / 100.0;
}