zoukankan      html  css  js  c++  java
  • 知道请假时间段、工作日和工作时长,计算请假天数

    function getDuration(starTime, endTime) {//计算时长
      let num1 = 0,num2 = 0;
      num1 = parseInt(starTime.split(":")[0]) +parseInt(starTime.split(":")[1]) / 60;
      num2 = parseInt(endTime.split(":")[0]) + parseInt(endTime.split(":")[1]) / 60;
      return num2-num1
    };
    function DateDiff(sDate1, sDate2){//计算2018-03-23 至 2018-04-01之间的时间差,开始天数不计算在内
      var aDate, oDate1, oDate2, iDays
      aDate = sDate1.split("-")
      oDate1 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
      aDate = sDate2.split("-")
      oDate2 = new Date(aDate[1] + '-' + aDate[2] + '-' + aDate[0])
      iDays = parseInt(Math.abs(oDate1 - oDate2) / 1000 / 60 / 60 /24)
      return iDays
    }
    function calculateTimeOff(st,et) {//计算不是整天部分的请假时长
      let m={key:null, duration:null},n={key:null, duration:null},o=null;
      workTime.forEach((v,k)=>{
        if(v[0]<= st && v[1] >= st){//开始时间在上班时间段内
          m.key = k
          m.duration = getDuration(st,v[1])
        }
        if(workTime[k+1]){//有下一个上班时间段
          if(v[0]<et && v[1]>=et){//在上班时段内
            n.key = k
            n.duration = v[1] == et ? getDuration(v[0],v[1]) : getDuration(v[0],et)
          }else if(et>v[1] && et < workTime[k+1][0]){//不在上班时段内
            n.key = k
            n.duration = getDuration(v[0],v[1])
          }
        }else{//没有下一个上班时间段
          if(v[0]<et && v[1]>=et){//在上班时段内
            n.key = k
            n.duration = v[1] == et ? getDuration(v[0],v[1]) : getDuration(v[0],et)
          }else if(v[0]<et && et > v[1]){//不在上班时段内
            n.key = k
            n.duration = getDuration(v[0],v[1])
          }
        }
      });
      if(n.key - m.key > 1){
        workTime.forEach((v,k)=>{
          if(m.key<k<n.key){
            o = o + getDuration(v[1],v[0]);
          }
        });
        return (o + m.duration + n.duration)/workHours;
      }else if(n.key == m.key){
        if(et>workTime[m.key][1]){
          return (getDuration(st,workTime[m.key][1])/workHours);
        }else{
          return (getDuration(st,et)/workHours);
        }
      }else{
        return (m.duration + n.duration)/workHours;
      }
    }
    let workTime=["09:00","18:00"];
    let workHours = 8;
    let startTime = "2018-3-27 09:00".split(" ")[1];
    let endTime =  "2018-3-29 18:00".split(" ")[1];
    let dayNum = DateDiff("2018-3-27 09:00".split(" ")[0],"2018-3-27 09:00".split(" ")[0])
    if(dayNum == 0){
      val.days = calculateTimeOff(startTime,endTime)
    }else{
      if(val.dateType==2){//请假时长计算 自然日
        val.days = dayNum + calculateTimeOff(startTime, workTime[workTime.length-1][1]) + calculateTimeOff(workTime[0][0],endTime)-1
      }else{//请假时长只计算工作日
        let noUseDay = 0// 请假时段内有几天是休息日
        let unixDb = new Date(val.startDate.split(" ")[0]).getTime()// 开始时间
        let unixDe = new Date(val.endDate.split(" ")[0]).getTime()// 结束时间
        for (let k = unixDb; k <= unixDe;) {//循环遍历 判断时间段内有几个周末
          if (val.workDay.indexOf(new Date(k).getDay()) == -1) {
            noUseDay = ++noUseDay
          }
          k = k + 24 * 60 * 60 * 1000
        }
        val.days = dayNum - noUseDay + calculateTimeOff(startTime, workTime[workTime.length-1][1]) + calculateTimeOff(workTime[0][0],endTime)-1
      }
    }
  • 相关阅读:
    debug:am dumpheap命令源码分析
    Android12系统源码分析:NativeTombstoneManager
    性能工具|ANRdaemon
    exampleappcoldstartbinder.trace
    debug:am profile命令的实现
    android studio的巨坑笔记
    android studio获取签名哈希
    Nginx配置反向代理 proxy_pass King
    Nginx配置反向代理 rewrite King
    Nginx配置文件nginx.conf详解 King
  • 原文地址:https://www.cnblogs.com/-tao/p/8657998.html
Copyright © 2011-2022 走看看