js获取一段时间内的工时,排除去周末、非工作时间

需求:每天8小时, 上午8:00~12:00, 下午13:00~17:00 (排除周六、周日)。

js代码:

/**
 * 0-15分不算工时
 * 15-45算半个小时
 * 45-60算一个小时
 */
function carryTime(date) {
  if (date.getMinutes() > 0 && date.getMinutes() < 15) {
    date.setMinutes(0)
  }
  if (date.getMinutes() >= 15 && date.getMinutes() < 30) {
    date.setMinutes(30)
  }
  if (date.getMinutes() > 30 && date.getMinutes() < 45) {
    date.setMinutes(30)
  }
  if (date.getMinutes() >= 45) {
    date.setHours(date.getHours() + 1)
    date.setMinutes(0)
  }
  return date
}

/**
 * 工时计算
 * @param {Date} startTime 开始时间
 * @param {Date} endTime 结束时间
 * @returns 工时时长
 */
export function getWorkHours(startTime, endTime) {
  if (startTime >= endTime) return 0

  //1 分钟取整
  startTime = carryTime(startTime)
  endTime = carryTime(endTime)

  //2 总天数
  var totalTime = Math.floor(((endTime - startTime) / (3600 * 1000)) / 24)

  //3 拿初始值赋值给一个临时变量
  var tempStartTime = new Date()
  tempStartTime.setTime(startTime.getTime())

  //4 有效的总天数(不包括周六周日)
  while (tempStartTime.getDate() < endTime.getDate()) {
    if (tempStartTime.getDay() == 6 || tempStartTime.getDay() == 0) {
      // 减去周六或者周日
      totalTime--
    }
    tempStartTime.setDate(tempStartTime.getDate() + 1)
  }

  //5 有效的总小时数
  var temp = 0
  while (startTime.getHours() * 60 + startTime.getMinutes() != endTime.getHours() * 60 + endTime.getMinutes()) {
    if (startTime.getDay() == 6 || startTime.getDay() == 0) {
      // 周六周日直接跳过,初始化为下一天早晨8点
      startTime.setDate(startTime.getDate() + 1)
      startTime.setHours(8)
      startTime.setMinutes(0)
      continue
    }

    let tempMinutes = startTime.getHours() * 60 + startTime.getMinutes()
    //上午8点到12点,算工时
    if (tempMinutes >= 8 * 60 && tempMinutes < (12 * 60)) {
      temp += 0.05
    }
    //上午13点到17点,算工时
    if (tempMinutes >= 13 * 60 && tempMinutes < (17 * 60)) {
      temp += 0.05
    }

    startTime.setTime(startTime.getTime() + 0.5 * 3600 * 1000)//每次增加半个小时
  }

  // 半小时0.05, 一天0.8(每天8小时)
  {
    totalTime += Math.floor(temp / 0.8)
    totalTime += temp % 0.8
    totalTime = Math.round(totalTime * 100) / 100
  }
  
  var days = Math.floor(totalTime)
  var hours = Math.round((totalTime - days) * 100) / 10
  // console.log(days + '天', hours + '小时')

  return days * 8 + hours
}

参考转载js获取一段时间内的工时,除去周末,午休时间

你可能感兴趣的:(javaScript,javascript)