知道請假時間段、工作日和工作時長,計算請假天數


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
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM