如何让日期加上数字后变成日期而且跳过周末?

日期加上时间,最后结果跳过周末

已知一个时间 '2021-03-02 12:00:00',加上一段时间,得到最后结果。

最后结果要求是:

  1. 不能是周六日,如果是调到周一,剩余时间从第二天9点开始算起。
  2. 时间只能在9点到17点。

我们的项目是给一个政府人员派发事件,并且规定处理事件的时间。因为他们是朝九晚五的工作制,添加一定的工作时间,不能算上休息时间。

例如:

一个时间 '2021-03-05 12:00:00‘ ,在日历上知道,这是周五,

​ 加上3h,结果为'2021-03-05 15:00:00

​ 加上5h,结果为'2021-03-05 17:00:00

​ 加上6h,结果为'2021-03-05 18:00:00 但是超过了下午5点,从第二天9点开始算起,为2021-03-06 10:00:00 。但是这个时间是周六,所以变成了2021-03-08 10:00:00 。

代码:

//用的是 moment.js
// lastTime 为初始时间  hour为添加小时数
export function timeAdd(lastTime, hour ) {
  let value = moment(lastTime).format("HH:mm:ss")
  //默认下班时间
  let defaultValue = moment('17:00:00', "HH:mm:ss")
  //相差秒数
  let diffss = defaultValue.diff(moment(value, "HH:mm:ss"), 'S')
  let second = getSecond(hour)
  //结果时间在当天
  if (second <= diffss) {
    return moment(lastTime).add(hour, 'h').format('YYYY-MM-DD HH:mm:ss')
  }

  //剩余秒数
  let secondsLeft = second - diffss
  // //结果时间在第二天
  if (secondsLeft <= getSecond(8)) {
    return judgingHolidays(moment(lastTime), 1).set({ hour: 9 }).add(secondsLeft, 's').format('YYYY-MM-DD HH:mm:ss')
  }
  //结果不是当天
  let addDay = parseInt(secondsLeft / getSecond(8))
  let addSecond = secondsLeft % getSecond(8)
  return judgingHolidays(moment(lastTime), addDay + 1).set({ hour: 9 }).add(addSecond, 's').format('YYYY-MM-DD HH:mm:ss')
}

//得到秒数
function getSecond(h) {
  return h * 60 * 60
}
//判断是否在假期(周末)
function judgingHolidays(time, day) {
  let arr = [1, 2, 3, 4, 5]
  let temp = 0
  for (var i = 1; i <= day; i++) {
    time = time.add(1, 'd')
    let num = time.isoWeekday()
    if (arr.indexOf(num) < 0) {
      console.log(temp)
      temp++
    }
  }
  if (temp > 0) {
    judgingHolidays(time, temp)
  }
  return time
}

timeAdd("2021-03-05 12:00:00",3)   ==>2021-03-05 15:00:00
timeAdd("2021-03-05 12:00:00",5)   ==>2021-03-05 17:00:00
timeAdd("2021-03-05 12:00:00",6)   ==>2021-03-08 10:00:00

如果项目是添加工作日,不是工作时

//把工作日变为工作时  day*8  加上一天  具体项目具体分析
timeAdd("2021-03-05 12:00:00",1*8)   ==>2021-03-08 12:00:00
posted @ 2021-03-08 10:16  努力的搬砖工  阅读(672)  评论(0)    收藏  举报