JS获取两个日期工作日相差的小时数(不包含周末)----可以指定一天的上班时间

        //获取两个日期相差的工作小时(不包括节假日)
        function getHour(StartTime, EndTime) {
            StartTime = new Date(StartTime.replace(/-/g, '/'));
            EndTime = new Date(EndTime.replace(/-/g, '/'));
            var ms = Math.abs(EndTime.getTime() - StartTime.getTime());

            //实际工时(天) = 起止日期差 - 周六日数目。
            if ((StartTime.getMonth() == EndTime.getMonth()) && (StartTime.getDate() == EndTime.getDate())) {
                //若为同一日期
                var hour1 = (getDayHour(StartTime.getHours(), StartTime.getMinutes(), EndTime.getHours(), EndTime.getMinutes(), "1")).toFixed(1);
                return hour1;
            }
            else {
                //若不为同一日期
                var days = Math.floor(ms / 1000 / 60 / 60 / 24) + 1;
                var workDayVal = 0;
                //工时的余数
                var remainder = days % 7;
                //工时向下取整的除数
                var divisor = Math.floor(days / 7);
                var weekendDay = 2 * divisor;

                //起始日期的星期,星期取值有(1,2,3,4,5,6,0)
                var nextDay = StartTime.getDay();
                //从起始日期的星期开始 遍历remainder天
                for (var tempDay = remainder; tempDay >= 1; tempDay--) {
                    //第一天不用加1
                    if (tempDay == remainder) {
                        nextDay = nextDay + 0;
                    } else if (tempDay != remainder) {
                        nextDay = nextDay + 1;
                    }
                    //周日,变更为0
                    if (nextDay == 7) {
                        nextDay = 0;
                    }

                    //周六日
                    if (nextDay == 0 || nextDay == 6) {
                        weekendDay = weekendDay + 1;
                    }
                }
                workDayVal = days - weekendDay - 2;
                var hour0 = (workDayVal * 8 + getDayHour(StartTime.getHours(), StartTime.getMinutes(), EndTime.getHours(), EndTime.getMinutes(), "0")).toFixed(1);
                return hour0;
            }
        }
        //计算开始日期与结束日期两天的请假小时数或者同一天的小时数
        //上班时间:早上08:30-12:30 下午:14:00-18:00
        function getDayHour(sh, sm, eh, em, type) {
            sh = parseInt(sh);
            eh = parseInt(eh);
            if (type == "0") {
                //计算非当天
                if (8 <= sh&&sh <= 12) {
                    sh = 12 - sh + 4 + ((60 - sm) / 60);
                } else if (14 <= sh <= 18) {
                    sh = 18 - sh + ((60 - sm) / 60);
                }

                if (8 <= eh &&eh<= 12) {
                    eh = eh - 8 + (em / 60);
                } else if (14 <= eh <= 18) {
                    sh = eh - 14 + 4 + (em / 60);
                }

                return parseFloat(sh + eh-1);
            }
            else {
              
                //计算当天

               
                if (sh == eh) {
                    //在同一小时
                    if (sm == em) {
                        return 0;
                    } else {
                        return Math.abs((sm - em) / 60);
                    }
                }
                else
                {
                    //不在同一小时
    
                    //开始时间在上午时间段,并且结束时间在下午时间段
                    if ((8 <= sh&& sh<= 12) && (14 <= eh && eh<= 18)) {
                        if ( sm == 30)
                            return parseFloat(12 - sh + eh - 14 + (em / 60));
                        else if (sm < 30) {
                            return parseFloat(12 - sh + eh - 14 + ((30 - sm) / 60) + (em / 60));

                        } else if (sm > 30 && sh != 12) {
                            return parseFloat(12-sh-1+eh - 14 + ((60 - sm) / 60) + 0.5 + (em / 60));
                        }
                    }
                    //开始时间与结束时间都在上午时间段
                    if ((8 <= sh&&sh <= 12) && (8 <= eh&&eh <= 12)) {
                      
                        if (sm == em) {
                            return parseFloat(Math.abs(eh - sh));
                        } else {
                          
                            return parseFloat(Math.abs(eh - sh - 1) + (60 - sm) / 60 + em / 60);
                        }
                       
                    } else if (14 <= sh&&sh <= 18 && 14 <= eh&&eh <= 18) {
                        if (sm == em) {
                            return parseFloat(Math.abs(eh - sh));
                        } else {
                        
                            return parseFloat(Math.abs(eh - sh - 1) + (60 - sm) / 60 + em / 60);
                        }
                    }
                 
                }
            }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laizhixue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值