js 传入两个YYYY-MM-DD HH:mm:ss格式的请假期限时间,然后还要传入上班时间和下班时间(都是HH:mm:ss格式),最后我想算出请假期限时间是半天还是1天还是1天半等等请假时间长短

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值