计算请假工时,去除周六周末的时间

做项目时,写到一个请假的模块,需要计算请假工时,去除周六周末,时间为一天8H,8:00-17:00,中午12:00-13:00 为午休时间

function getLeaveTime(startDate,endDate){
    var datetime1 = new Date(startDate), datetime2 = new Date(endDate);

    var date1 = datetime1.setHours(0,0,0);    //开始日期,毫秒表示
    var date2 = datetime2.setHours(0,0,0);    //结束日期,毫秒表示

    datetime1.setHours(startDate.substr(11,2),0,0);
    datetime2.setHours(endDate.substr(11,2),0,0);
    var travelHours = 0;    //保存请假小时数
    //开始结束时间均在一天
    if(date1 == date2){
        //1.开始时间8-12点
        if(datetime1.getHours()>=8 && datetime1.getHours()<=12){
            //1.1 结束时间在8-12点
            if(datetime2.getHours()>=8 && datetime2.getHours()<=12){
                travelHours += (datetime2.getHours()- datetime1.getHours() );
            }
            //1.2  结束时间在13-17点
            if(datetime2.getHours()>=13 && datetime2.getHours()<=17){
                travelHours += 12- datetime1.getHours()+datetime2.getHours()-13;
            }

            //1.3
            if(datetime2.getHours()>17){
                toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time);
                return;
            }
        }
        //如果开始时间小于8点
        if(datetime1.getHours()<8){
            toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time);
            return;
        }
        //如果开始时间大于17点,
        if(datetime1.getHours()>17){
            toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time);
            return;
        }
        //2.开始时间在13-17点
        if(datetime1.getHours()>=13 && datetime1.getHours()<=17){
            //1.2  结束时间在13-17点
            if(datetime2.getHours()>=13 && datetime2.getHours()<=17){
                travelHours += datetime2.getHours()-datetime1.getHours();
            }
            //2.2 如果结束时间在17点之后,则工时累计到17点截止
            if(datetime2.getHours()>17){
                travelHours += 17-datetime1.getHours();
            }
        }

    }else{
        //如果开始时间小于8点,则计算工时的时候从8点开始计算
        if(datetime1.getHours()<8){
            toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time);
            return;
        }
        //如果开始时间大于17点,
        if(datetime1.getHours()>17){
            toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time);
            return;
        }

        if(datetime2.getHours()<8){
            toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time);
            return;
        }
        //1.3
        if(datetime2.getHours()>17){
            toastr.error(SAFESOFT_LEAVE_I18N.msg_leave_time);
            return;
        }
        //计算开始时间当天工时
        if(datetime1.getHours()>=8 && datetime1.getHours()<=12){
            travelHours+=17-datetime1.getHours()-1;
        }
        if(datetime1.getHours()>=13 && datetime1.getHours()<=17){
            travelHours+=17-datetime1.getHours();
        }
        //计算结束时间当天工时
        if(datetime2.getHours()>=8 && datetime2.getHours()<=12){
            travelHours+=datetime2.getHours()-8;
        }
        if(datetime2.getHours()>=13 && datetime2.getHours()<=17){
            travelHours+=datetime2.getHours()-8-1;
        }
        //计算开始时间和结束时间相差天数  开始时间和结束时间不算进去,只计算相差的时间
        if((date2 - date1) / 1000 / 60 / 60 / 24-1>0){
            travelHours+=((date2 - date1) / 1000 / 60 / 60 / 24-1)*8;
        }
        //计算开始时间和结束时间之中有几个周六周末,然后去除这个时间
        if((weekendBetween(new Date(date1),new Date(date2)))>0){
            travelHours-=weekendBetween(new Date(date1),new Date(date2))*8;
        }
    }
    return travelHours;

}
 
这个计算两个日期之间有几个周末,转载http://www.cnblogs.com/darkangle/archive/2008/02/14/1069182.html
//计算两个日期之间有几个周末
function weekendBetween(dtStart, dtEnd) {
    if (typeof dtEnd == 'string' )
        dtEnd = StringToDate(dtEnd);
    if (typeof dtStart == 'string' )
        dtStart = StringToDate(dtStart);

    var days =  parseInt((dtEnd - dtStart) / 86400000);
    var adds = 0;
    var m = (days+ dtStart.getDay() +1) % 7;
    if(m > 0)
        adds = m;
    if(m >2)
        adds = 2;

    var redu = 0
    if(dtStart.getDay() > 0)
        redu = 2;
    if(dtStart.getDay() ==1)
        redu =1;

    var subtotal = parseInt((days + dtStart.getDay() +1)/7)*2;
    return subtotal - redu + adds;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值