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

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

参考的方法getWorkHours存在bug,推荐使用方法2 getWorkHoursV2

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 < endTime) {
    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
}


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

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

  //2 有效的总小时数
  var temp = 0
  while (startTime.getTime() < endTime.getTime()) {
    // 排除周六或者周日
    if (startTime.getDay() == 6 || startTime.getDay() == 0) {
      // 周六周日直接跳过,初始化为下一天早晨8点
      startTime.setDate(startTime.getDate() + 1)
      startTime.setHours(8)
      startTime.setMinutes(0)
      continue
    }

    // 计算每天有效工时
    while (startTime.getHours() * 60 + startTime.getMinutes() != endTime.getHours() * 60 + endTime.getMinutes()) {
      let tempMinutes = startTime.getHours() * 60 + startTime.getMinutes()
      //上午8点到12点,算工时
      if (tempMinutes >= (8 * 60) && tempMinutes < (12 * 60)) {
        temp += 0.5
      }
      //上午13点到17点,算工时
      if (tempMinutes >= (13 * 60) && tempMinutes < (17 * 60)) {
        temp += 0.5
      }
      //每次增加半个小时
      startTime.setTime(startTime.getTime() + 0.5 * 3600 * 1000)
    }

    // 下一天早晨8点
    startTime.setDate(startTime.getDate() + 1)
    startTime.setHours(8)
    startTime.setMinutes(0)
  }

  // 有效总工时
  return temp
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值