如何让日期加上数字后变成日期而且跳过周末?
日期加上时间,最后结果跳过周末
已知一个时间 '2021-03-02 12:00:00',加上一段时间,得到最后结果。
最后结果要求是:
- 不能是周六日,如果是调到周一,剩余时间从第二天9点开始算起。
- 时间只能在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

浙公网安备 33010602011771号