Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript向日期添加工作日_Javascript - Fatal编程技术网

使用JavaScript向日期添加工作日

使用JavaScript向日期添加工作日,javascript,Javascript,如何使用JavaScript添加工作日(即周一至周五),并在必要时自动添加周末 因此,如果我在今天(2016年11月22日星期二)加上5个工作日,结果应该是“2016年11月29日星期二”,而不是“2016年11月27日星期日”。可以使用日期设置日期功能(与获取日期)在日期上加上天数,即- var myDate = new Date(); // Tue 22/11/2016 myDate.setDate(myDate.getDate() + 3); // Fri 25/11/2016 因此,一

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


因此,如果我在今天(2016年11月22日星期二)加上5个工作日,结果应该是“2016年11月29日星期二”,而不是“2016年11月27日星期日”。可以使用
日期
设置日期
功能(与
获取日期
)在日期上加上天数,即-

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.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)
我想你可以用

例如:

// 22-11-2016 is Tuesday, DD-MM-YYYY is the format 
moment('22-11-2016', 'DD-MM-YYYY').businessAdd(5)._d // Tue Nov 29 2016 00:00:00 GMT-0600 (CST) 
const date=新日期('2000-02-02')
const daysToAdd=mapToWorkdays(日期,37)
date.setUTCDate(date.getUTCDate()+daysToAdd)
console.log(date.toISOString().split('T')[0])
//打印2000-03-24
/**
*@param{Date}Date开始日期
*@param{number}添加要添加的工作日数
*@return{number}要添加以达到正确日期的总天数
*/
函数映射到工作日(日期,添加){
const wd=工作日(日期)
设r=Math.trunc(加法/5)*2
常量rem=添加%5
如果(wd>4)r+=(6-wd)
否则,如果(wd+rem>4)r+=2
返回add+r
}
/**
*@param{Date}Date
*@return{number}在0..6范围内的一周中的第几天(星期一..星期日)
*/

函数weekday(date){return(date.getUTCDay()+6)%7}
更新了上面的脚本,以便在给定负天数时也减去工作日

function addWorkDays(startDate, days) {
    var isAddingDays = (days > 0);
    var isDaysToAddMoreThanWeek = (days > 5 || days < -5);

    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
    }
    var dow = startDate.getDay();
    var daysToAdd = parseInt(days);

    if ((dow === 0 && isAddingDays) || (dow === 6 && !isAddingDays)) {
        daysToAdd = daysToAdd + (1 * (isAddingDays ? 1 : -1));
    } else if ((dow === 6 && isAddingDays) || (dow === 0 && !isAddingDays)) {
        daysToAdd = daysToAdd + (2 * (isAddingDays ? 1 : -1));
    }

    if (isDaysToAddMoreThanWeek) {
        daysToAdd = daysToAdd + (2 * (Math.floor(days / 5)));

        if (days % 5 != 0)
            daysToAdd = daysToAdd + (2 * (isAddingDays ?  -1 : 1));
    }

    startDate.setDate(startDate.getDate() + daysToAdd);
    var newDate = moment(startDate).format('MM/DD/YYYY');
    return newDate;
}
函数添加工作日(开始日期,天){
var isAddingDays=(天>0);
var为每周增加的天数=(天数>5天| |天<-5天);
如果(isNaN(天)){
log(“为\“天\”提供的值不是一个数字”);
返回
}
如果(!(开始日期-开始日期-结束日期)){
log(“为\“startDate\”提供的值不是日期对象”);
返回
}
var dow=startDate.getDay();
var daysToAdd=parseInt(天);
如果((道琼斯指数===0&&isAddingDays)| |(道琼斯指数===6&&isAddingDays)){
daysToAdd=daysToAdd+(1*(isAddingDays?1:-1));
}否则如果((道琼斯指数===6&&isAddingDays)| |(道琼斯指数===0&&isAddingDays)){
daysToAdd=daysToAdd+(2*(isAddingDays?1:-1));
}
如果(IsDaysToAdds超过一周){
daysToAdd=daysToAdd+(2*(数学下限(天/5));
如果(天数%5!=0)
daysToAdd=daysToAdd+(2*(isAddingDays-1:1));
}
startDate.setDate(startDate.getDate()+daysToAdd);
var newDate=时刻(startDate)。格式('MM/DD/YYYY');
返回newDate;
}

如果是几天,而不是几千天,那么这更容易理解:

let currentDate = new Date();

for (let i =1; i<=p.days;i++)
{
 currentDate.setDate(currentDate.getDate() + 1 );
 if (currentDate.getDay() == 6)
 {
  currentDate.setDate(currentDate.getDate() + 2 );
 }
 else if (currentDate.getDay() == 0)
 {
  currentDate.setDate(currentDate.getDate() + 1 );
 }
}
让currentDate=新日期();

对于(让i=1;对于原型,我使用
返回此.addDays(daysToAdd),而不是
this.setDate(this.getDate()+daysToAdd);
因为它更像本机
Date.prototype.addDays
的工作方式。@CSquared native
Date.prototype.addDays
?我不知道本机
addDays
方法,并且它没有在MDN-上记录;您确定它没有被另一个JS文件添加到您的解决方案中吗?我已经纠正了,它不是本机的ve。在我的例子中,它来自剑道UI库。我希望它是本机的。我认为此解决方案不正确。对于星期六和星期日,当add参数是5的倍数时,mapToWorkdays的结果不正确。我已与Excel返回的结果进行了比较,确认这些特定结果是错误的。我已替换用if(wd>4)r+=(6-wd)乘以if(wd>4){r+=(6-wd)if(rem==0)r-=2}来纠正这个问题。在这里查看早期的解决方案甚至更错误,但我没有花时间来修复它们。从星期二开始加上5天(它返回下一个星期天)不起作用。