javascript - 使用 JavaScript 将工作日添加到日期

标签 javascript

我如何使用 JavaScript 添加工作日(即周一至周五)并在必要时自动添加周末?

因此,如果我要在今天(2016 年 11 月 22 日星期二)基础上增加 5 个工作日,结果应该是“2016 年 11 月 29 日星期二”而不是“2016 年 11 月 27 日星期日”。

最佳答案

可以使用 DatesetDate 函数(结合 getDate)在日期上添加天数,即 -

var myDate = new Date(); // Tue 22/11/2016
myDate.setDate(myDate.getDate() + 3); // Fri 25/11/2016

因此,一旦您计算出工作日期间的周末天数,您就可以将其和所需的工作日天数添加到开始日期以获得最终日期。

这个功能应该可以工作,但显然这不会考虑国定假日 -

function addWorkDays(startDate, days) {
    if(isNaN(days)) {
        console.log("Value provided for \"days\" was not a number");
        return
    }
    if(!(startDate instanceof Date)) {
        console.log("Value provided for \"startDate\" was not a Date object");
        return
    }
    // Get the day of the week as a number (0 = Sunday, 1 = Monday, .... 6 = Saturday)
    var dow = startDate.getDay();
    var daysToAdd = parseInt(days);
    // If the current day is Sunday add one day
    if (dow == 0)
        daysToAdd++;
    // If the start date plus the additional days falls on or after the closest Saturday calculate weekends
    if (dow + daysToAdd >= 6) {
        //Subtract days in current working week from work days
        var remainingWorkDays = daysToAdd - (5 - dow);
        //Add current working week's weekend
        daysToAdd += 2;
        if (remainingWorkDays > 5) {
            //Add two days for each working week by calculating how many weeks are included
            daysToAdd += 2 * Math.floor(remainingWorkDays / 5);
            //Exclude final weekend if remainingWorkDays resolves to an exact number of weeks
            if (remainingWorkDays % 5 == 0)
                daysToAdd -= 2;
        }
    }
    startDate.setDate(startDate.getDate() + daysToAdd);
    return startDate;
}

//And use it like so (months are zero based)
var today = new Date(2016, 10, 22);
today = addWorkDays(today, 5); // Tue Nov 29 2016 00:00:00 GMT+0000 (GMT Standard Time)

它也可以添加到 Date 原型(prototype)中 -

Date.prototype.addWorkDays = function (days) {
    if(isNaN(days)) {
        console.log("Value provided for \"days\" was not a number");
        return
    }

    // Get the day of the week as a number (0 = Sunday, 1 = Monday, .... 6 = Saturday)
    var dow = this.getDay();
    var daysToAdd = parseInt(days);
    // If the current day is Sunday add one day
    if (dow == 0) {
        daysToAdd++;
    }
    // If the start date plus the additional days falls on or after the closest Saturday calculate weekends
    if (dow + daysToAdd >= 6) {
        //Subtract days in current working week from work days
        var remainingWorkDays = daysToAdd - (5 - dow);
        //Add current working week's weekend
        daysToAdd += 2;
        if (remainingWorkDays > 5) {
            //Add two days for each working week by calculating how many weeks are included
            daysToAdd += 2 * Math.floor(remainingWorkDays / 5);
            //Exclude final weekend if the remainingWorkDays resolves to an exact number of weeks
            if (remainingWorkDays % 5 == 0)
                daysToAdd -= 2;
        }
    }
    this.setDate(this.getDate() + daysToAdd);
};

//And use it like so (months are zero based)
var today = new Date(2016, 10, 22)
today.addWorkDays(5); // Tue Nov 29 2016 00:00:00 GMT+0000 (GMT Standard Time)

关于javascript - 使用 JavaScript 将工作日添加到日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40739059/

相关文章:

javascript - 比较两个 URL 模板的优化算法

javascript - Google API获取刷新 token : Uncaught ReferenceError: offline is not defined

javascript - 如何在内部(应用程序的私有(private))存储中下载图像文件以响应 native

javascript - 支持设置cookies的Flash视频播放器?

php - Codeigniter 验证库在 session 中存储错误

javascript - 删除本地存储数据的方法有哪些?

javascript - 恶意编码的 JavaScript - 它有什么作用?

javascript - 单击按钮时打开半页

javascript - 区分浏览器刷新和浏览器关闭

javascript - 如何获取单页内部文本?