«

2021年8月5日 JavaScript获取工作日

Mahalalel 发布于 阅读:3157 JavaScript


背景

小伙伴Lucas有个需求:初始时间为工作日,要找n天后的工作日的时间

实现

第一种

    /**
     * 判断下一个工作日的时间
     */
    function get_next_weekday(date) {
        var tomorrow = new Date(date.setDate(date.getDate() + 1))
        return tomorrow.getDay() % 6 ? tomorrow : get_next_weekday(tomorrow)
    }

    function getWeekday(date,num){
        for (let i = 1; i <= num; i++) {
            date = get_next_weekday(date);
            console.log(date)
        }
        console.log("最后:"+date)
        return date;
    }
    getWeekday(new Date(), 10)

日志输出结果:

Fri Aug 06 2021 17:33:52 GMT+0800 (中国标准时间)
Mon Aug 09 2021 17:33:52 GMT+0800 (中国标准时间)
Tue Aug 10 2021 17:33:52 GMT+0800 (中国标准时间)
Wed Aug 11 2021 17:33:52 GMT+0800 (中国标准时间)
Thu Aug 12 2021 17:33:52 GMT+0800 (中国标准时间)
Fri Aug 13 2021 17:33:52 GMT+0800 (中国标准时间)
Mon Aug 16 2021 17:33:52 GMT+0800 (中国标准时间)
Tue Aug 17 2021 17:33:52 GMT+0800 (中国标准时间)
Wed Aug 18 2021 17:33:52 GMT+0800 (中国标准时间)
Thu Aug 19 2021 17:33:52 GMT+0800 (中国标准时间)
最后:Thu Aug 19 2021 17:33:52 GMT+0800 (中国标准时间)

第二种方式

function getWeekday(date, num) {
    for(let i = 1; i <= num; i++) {
        date = new Date(+date);
        do {
            date.setDate(date.getDate() + 1);
        } while (!(date.getDay() % 6))
        console.log(date)
    }
    console.log("最后:"+date)
}
getWeekday(new Date(), 10)

日志输出结果:

Fri Aug 06 2021 17:35:41 GMT+0800 (中国标准时间)
Mon Aug 09 2021 17:35:41 GMT+0800 (中国标准时间)
Tue Aug 10 2021 17:35:41 GMT+0800 (中国标准时间)
Wed Aug 11 2021 17:35:41 GMT+0800 (中国标准时间)
Thu Aug 12 2021 17:35:41 GMT+0800 (中国标准时间)
Fri Aug 13 2021 17:35:41 GMT+0800 (中国标准时间)
Mon Aug 16 2021 17:35:41 GMT+0800 (中国标准时间)
Tue Aug 17 2021 17:35:41 GMT+0800 (中国标准时间)
Wed Aug 18 2021 17:35:41 GMT+0800 (中国标准时间)
Thu Aug 19 2021 17:35:41 GMT+0800 (中国标准时间)
最后:Thu Aug 19 2021 17:35:41 GMT+0800 (中国标准时间)

第三种方式

function getWorkDate(startDate, limitDay) {
    var startTime = startDate.getTime();
    var T = 24 * 60 * 60 * 1000;
    var endTime = startTime + (limitDay * T);
    if(limitDay > 0) {
        var holidays = 0;
        for(var i = startTime + T; i <= endTime; i += T){
            var date = new Date(i);
            if(date.getDay() == 0 || date.getDay() == 6){  //此处为节假日逻辑
                holidays++;
            }
            console.log(date);
        }
        return getWorkDate(new Date(endTime), holidays);
    } else {
        return startDate;
    }
}
getWorkDate(new Date(),10)

日志输出:

Fri Aug 06 2021 17:42:02 GMT+0800 (中国标准时间)
Sat Aug 07 2021 17:42:02 GMT+0800 (中国标准时间)
Sun Aug 08 2021 17:42:02 GMT+0800 (中国标准时间)
Mon Aug 09 2021 17:42:02 GMT+0800 (中国标准时间)
Tue Aug 10 2021 17:42:02 GMT+0800 (中国标准时间)
Wed Aug 11 2021 17:42:02 GMT+0800 (中国标准时间)
Thu Aug 12 2021 17:42:02 GMT+0800 (中国标准时间)
Fri Aug 13 2021 17:42:02 GMT+0800 (中国标准时间)
Sat Aug 14 2021 17:42:02 GMT+0800 (中国标准时间)
Sun Aug 15 2021 17:42:02 GMT+0800 (中国标准时间)
Mon Aug 16 2021 17:42:02 GMT+0800 (中国标准时间)
Tue Aug 17 2021 17:42:02 GMT+0800 (中国标准时间)
Wed Aug 18 2021 17:42:02 GMT+0800 (中国标准时间)
Thu Aug 19 2021 17:42:02 GMT+0800 (中国标准时间)

第四种方式

function getWorkDate(curentDate, nextWorkDays) {
    var T = 24 * 60 * 60 * 1000;
    var start= curentDate.getTime() + T;
    var end = start + nextWorkDays * T;
    var calDate=new Date();
    var en = function(start, end) {
        var holidays=0;
        for(var d = start; d < end; d += T){
            calDate.setTime(d);
            var day = calDate.getDay();
            if(day == 0 || day == 6){//此处为节假日逻辑
                holidays++;
            }
        }
        return holidays ? holidays + en(end, end+holidays*T) : 0;
    }
    calDate.setTime(curentDate.getTime() + (nextWorkDays + en(start, end))*T);
    return calDate;
}

第一种和第二种方式参考了腾讯社区的用户回答;原文链接:https://cloud.tencent.com/developer/ask/175878

第三种和第四种方式参考了CSDN博主「hhbmobile」的文章;原文链接:https://blog.csdn.net/TLoveTLove/article/details/8526503

获取工作日 n天