function calculateLeaveDuration(startDateStr, endDateStr, startTimeStr, endTimeStr) {
// 解析时间字符串为Date对象
function parseDateTime(dateTimeStr) {
const parts = dateTimeStr.split(' ');
const dateParts = parts[0].split('-').map(Number);
const timeParts = parts[1].split(':').map(Number);
return new Date(Date.UTC(dateParts[0], dateParts[1] - 1, dateParts[2], timeParts[0], timeParts[1], timeParts[2]));
}
// 计算两个时间之间的毫秒数差
function diffInMilliseconds(date1, date2) {
return Math.abs(date1 - date2);
}
// 将毫秒数转换为小时和分钟
function msToHoursAndMinutes(ms) {
const hours = Math.floor((ms / (1000 * 60 * 60)) % 24);
const minutes = Math.floor((ms / (1000 * 60)) % 60);
return { hours, minutes };
}
// 解析时间字符串
const startDate = parseDateTime(startDateStr);
const endDate = parseDateTime(endDateStr);
const startTime = parseDateTime(`${startDate.toISOString().split('T')[0]}T${startTimeStr}`); // 假设日期与startDate相同
const endTime = parseDateTime(`${startDate.toISOString().split('T')[0]}T${endTimeStr}`); // 假设日期与startDate相同
// 计算开始和结束时间在工作日内的时长(不考虑跨天)
const startWorkDuration = diffInMilliseconds(Math.max(startDate, startTime), Math.min(endDate, endTime));
// 如果开始和结束时间在同一天,则只计算当天的时长
if (startDate.toDateString() === endDate.toDateString()) {
const { hours, minutes } = msToHoursAndMinutes(startWorkDuration);
if (hours >= endTime.getHours() - startTime.getHours()) {
// 如果请假时长超过或等于半天,则视为1天
if (hours >= 8 || (hours === 7 && minutes >= 30)) {
return 1; // 1天
} else {
return 0.5; // 半天
}
} else {
// 不足半天的情况需要更精确的计算或可以忽略
return hours / 8; // 返回小数表示的小时数占全天的比例
}
} else {
// 跨天的情况,需要计算每天的时长并累加
let totalDays = 1; // 至少1天
let remainingMs = startWorkDuration;
// 如果结束日期在开始日期之后,则需要加上剩余的完整天数
while (endDate > startDate + (1000 * 60 * 60 * 24)) {
// 假设每天工作时间固定为8小时(可调整)
totalDays++;
startDate = new Date(startDate.getTime() + (1000 * 60 * 60 * 24)); // 增加一天
remainingMs -= 1000 * 60 * 60 * 8; // 减去一天的工作时间(8小时)
}
// 计算最后一天的工作时长(可能需要特殊处理半天的情况)
const { hours, minutes } = msToHoursAndMinutes(remainingMs);
if (hours >= 4 || (hours === 3 && minutes >= 30)) {
// 如果最后一天的工作时长超过或等于半天,则增加0.5天
totalDays += 0.5;
}
return totalDays;
}
}
// 使用示例
const startDateStr = '2023-03-25 09:00:00';
const endDateStr = '2023-03-27 15:00:00';
const startTimeStr = '09:0
12-08
08-26
724
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-22
595
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
11-02
249
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)