在Javascript中计算两个日期之间的天数(不包括星期日和一系列假日)

在Javascript中计算两个日期之间的天数(不包括星期日和一系列假日),javascript,arrays,Javascript,Arrays,如何在Javascript中计算两个日期之间的工作日 说 我想总天数不包括假期,如果有这两个日期之间存在,不包括星期日,如果有 我已经试过了,但是我不能在假日数组中使用它。diff=enddatestartdate; diff=endDate-startDate; var holidays=new Array("04-28-2013","05-22-2013","06-28-2013"); idx_holidays=0; num_holidays=0; while(idx_holidays &l

如何在Javascript中计算两个日期之间的工作日

我想总天数不包括假期,如果有这两个日期之间存在,不包括星期日,如果有

我已经试过了,但是我不能在假日数组中使用它。

diff=enddatestartdate;
diff=endDate-startDate;
var holidays=new Array("04-28-2013","05-22-2013","06-28-2013");
idx_holidays=0;
num_holidays=0;
while(idx_holidays < holidays.length)
   {
       holiday=new Date(holidays[idx_holidays]);
       if(diff>holiday-startDate)
           num_holidays++;
       idx_holidays++;
   }
var假期=新阵列(“04-28-2013”、“05-22-2013”、“06-28-2013”); idx_=0; 假期数=0; while(idx_假日<假日长度) { 假日=新日期(假日[idx_假日]); 如果(差异>假日开始日期) 假期++; idx_假期++; }
diff=enddatestartdate;
var假期=新阵列(“04-28-2013”、“05-22-2013”、“06-28-2013”);
idx_=0;
假期数=0;
while(idx_假日<假日长度)
{
假日=新日期(假日[idx_假日]);
如果(差异>假日开始日期)
假期++;
idx_假期++;
}

你需要做的是检查一天是否在你的开始和结束日期之间,如果是,则减去一天。然后,当您从一个日期切换到另一个日期时,您需要为不是day
0
(星期日)的每一天添加一天

此答案使用UTC时间,因此不必担心夏令时/时区等问题

//                    yyyy-MM-dd hh:mm:ss
var start = new Date('2013-04-25T00:00:00Z'),
    end   = new Date('2013-05-10T00:00:00Z'),
    holiday = [
        new Date('2013-04-27T00:00:00Z'),
        new Date('2013-05-03T00:00:00Z')
    ], i = holiday.length,
    n_days = 0;
while (i--) { // loop over holidays
    if (holiday[i] >= start)
        if (holiday[i] <= end)
            n_days = n_days - 1; // day holiday within dates
}
while (start <= end) {
    if (start.getUTCDay()) n_days = n_days + 1; // not sunday
    start.setUTCHours(24); // add a day
}
console.log(n_days); // 12

这样就不必每天循环。在此之后,您将使用与上述相同的检查来删除假日(请记住将
i
重新设置为
holiday.length
)。

您需要做的是检查开始和结束日期之间是否有一天,如果是,则减去一天。然后,当您从一个日期切换到另一个日期时,您需要为不是day
0
(星期日)的每一天添加一天

此答案使用UTC时间,因此不必担心夏令时/时区等问题

//                    yyyy-MM-dd hh:mm:ss
var start = new Date('2013-04-25T00:00:00Z'),
    end   = new Date('2013-05-10T00:00:00Z'),
    holiday = [
        new Date('2013-04-27T00:00:00Z'),
        new Date('2013-05-03T00:00:00Z')
    ], i = holiday.length,
    n_days = 0;
while (i--) { // loop over holidays
    if (holiday[i] >= start)
        if (holiday[i] <= end)
            n_days = n_days - 1; // day holiday within dates
}
while (start <= end) {
    if (start.getUTCDay()) n_days = n_days + 1; // not sunday
    start.setUTCHours(24); // add a day
}
console.log(n_days); // 12
这样就不必每天循环。在此之后,您将使用与上述相同的检查来删除假日(请记住将
i
重新设置为
holiday.length
)。

/* 有多种方法可以做到这一点

您可以将一年中的假日和周末放在一个数组中

通过过滤数组,可以从中减去假期数

两个日期之间的实际天数

或者在将工作日添加到开始日期时对其进行说明

当你跨越多年的时候,它会变得更加复杂

使用不同的假日阵列,但这就是计算机的用途。。。 */

if(!Array.prototype.filter){
Array.prototype.filter=函数(乐趣,范围){
var T=this,A=[],i=0,itm,L=T.length;
if(typeof fun=='function'){
而(i/*
有多种方法可以做到这一点

您可以将一年中的假日和周末放在一个数组中

通过过滤数组,可以从中减去假期数

两个日期之间的实际天数

或者在将工作日添加到开始日期时对其进行说明

当你跨越多年的时候,它会变得更加复杂

使用不同的假日阵列,但这就是计算机的用途。。。 */

if(!Array.prototype.filter){
Array.prototype.filter=函数(乐趣,范围){
var T=this,A=[],i=0,itm,L=T.length;
if(typeof fun=='function'){
而(i
//天计数
风险值天数\单位计数=0;
//开始日期
风险值开始=新日期(“2017年1月10日”);
//结束日期
var结束=新日期(“2017年10月21日”);
//假日数组
变量日期数组=[新日期('2017-01-26')、新日期('2017-03-13')、新
日期('2017-03-29')、新日期('2017-08-15')、新日期('2017-08-25')、新
日期('2017-10-02')、新日期('2017-10-19')、新日期('2017-12-25');
while(启动0&&start.getDay()<6){
天数=天数+1;
for(日期数组中的var dat){
var a=日期数组[dat];
a、 设定小时数(0,0,0,0);
如果(a.getTime()==start.getTime()){
天数=天数-1;
}
}
}
var newDate=start.setDate(start.getDate()+1);
开始=新日期(newDate);
}
控制台日志(天数);
//天数计数
风险值天数\单位计数=0;
//开始日期
风险值开始=新日期(“2017年1月10日”);
//结束日期
var结束=新日期(“2017年10月21日”);
//假日数组
变量日期数组=[新日期('2017-01-26')、新日期('2017-03-13')、新
日期('2017-03-29')、新日期('2017-08-15')、新日期('2017-08-25')、新
日期('2017-10-02')、新日期('2017-10-19')、新日期('2017-12-25');
while(启动0&&start.getDay()<6){
天数=天数+1;
for(日期数组中的var dat){
var a=日期数组[dat];
a、 设定小时数(0,0,0,0);
如果(a.getTime()==start.getTime()){
天数=天数-1;
}
}
}
var newDate=start.setDate(start.getDate()+1);
开始=新日期(newDate);
}
控制台日志(天数);

可能的重复,我希望这可以帮助您。大部分假期都没有在这里度过,您可能应该修改代码appropriately@ling.s:这里使用的是纯javascript,没有Jquery ui或任何库,因此这不是一个重复的问题。@dreamweiver:这在周末很有效,但我无法删除nati两个日期之间的假期?@Sam Khanna:简单的逻辑是将假期存储在一个数组中,并将此数组与开始日期和结束日期之间的最终天数列表(从上面的代码返回)进行比较。这是否敲响了警钟;)可能的重复,我希望这能帮助你。大部分假期都没有在这里度过,你应该修改代码appropriately@ling.s:这里使用的是纯javascript,没有Jquery ui或任何库,因此这不是一个重复的问题。@dreamweiver:这在周末很好用,但我无法做如何删除国家代码两次约会之间的星期五?@Sam Khanna:简单的逻辑
n_days = (end - start) / 86400000; // time difference in days
i = n_days - start.getUTCDay(); // trim to first Sunday
i = i - i % 7; // trim to last Sunday
n_days = n_days - i / 7; // subtract Sundays
if(!Array.prototype.filter){
    Array.prototype.filter= function(fun, scope){
        var T= this, A= [], i= 0, itm, L= T.length;
        if(typeof fun== 'function'){
            while(i<L){
                if(i in T){
                    itm= T[i];
                    if(fun.call(scope, itm, i, T)) A[A.length]= itm;
                }
                ++i;
            }
        }
        return A;
    }
}
Date.prototype.dayOfYear= function(){
    var j1= new Date(this);
    j1.setMonth(0,0);
    return  Math.round((this-j1)/8.64e7);
}

// this covers a few years of federal holidays:

var holidates={
    y2012:[1, 2, 16, 51, 149, 186, 247, 282, 316, 317, 327, 360],
    y2013:[1, 21, 49, 147, 185, 245, 287, 315, 332, 359],
    y2014:[1, 20, 48, 146, 185, 244, 286, 315, 331, 359],
    y2015:[1, 19, 47, 145, 184, 185, 250, 285, 315, 330, 359],
    y2016:[1, 18, 46, 151, 186, 249, 284, 316, 329, 360, 361],
    y2017:[1, 2, 16, 20, 51, 149, 185, 247, 282, 314, 315, 327, 359],
    y2018:[1, 15, 50, 148, 185, 246, 281, 315, 316, 326, 359],
    y2019:[1, 21, 49, 147, 185, 245, 287, 315, 332, 359],
    y2020:[1, 20, 48, 146, 185, 186, 251, 286, 316, 331, 360],
    y2021:[1, 18, 20, 46, 151, 185, 186, 249, 284, 315, 329, 358, 359],
    y2022:[1, 17, 52, 150, 185, 248, 283, 315, 328, 359, 360, 365],
    y2023:[1, 2, 16, 51, 149, 185, 247, 282, 314, 315, 327, 359]
}

// return an array of weekends and holidays for a given year, 
// or the current year. Each element is the day of the year,
// Jan 1 is 1.

function getOffdays(y){
    if(typeof y!= 'number') y= new Date().getFullYear();
    var offdays= [], i= 0, firstwk, lastwk, H= holidates['y'+y].slice(0);
    var d= 1, year= new Date(y, 0, 1);
    while(year.getDay()!= 0) year.setDate(++d);
    firstwk= year.dayOfYear();
    year.setMonth(11, 31);
    d= 31;
    if(year.getDay()== 6) lastwk= year.dayOfYear();
    else{
        while(year.getDay()!= 0) year.setDate(--d);
        lastwk= year.dayOfYear();
    }
    while(firstwk<= lastwk){
        offdays.push(firstwk-1, firstwk);
        firstwk+= 7;
    }
    if(offdays[0]== 0) offdays.shift();
    if(H) offdays= offdays.concat(H);
    return offdays.sort(function(a, b){
        return a-b;
    });
}

// expects two dates, 
// returns the number of business days between them

function bizDays(day1, day2){
    var dayfrom= day1, dayto= day2;
    if(day1>day2){
        dayto= day1;
        dayfrom= day2;
    }
    var offdays= 0, diff= Math.round((dayto-dayfrom)/8.64e7),
    d1= dayfrom.dayOfYear(), d2= dayto.dayOfYear(),
    y1= dayfrom.getFullYear(), y2= dayto.getFullYear();

    if(y1<y2){
        offdays= getOffdays(y1).filter(function(d){
            return d>= d1;
        }).length;
        while(y1+1<y2){
            offdays+= getOffdays(++y1).length;
        }
        offdays+= getOffdays(y1).filter(function(d){
            return d<= d2;
        }).length;
    }
    else{
        offdays= getOffdays(y1).filter(function(d){
            return d>= d1 && d<= d2;
        }).length;
    }
    return diff-offdays;
}

// expects an integer and an optional start date-
// uses the current date if no date is specified.
// returns the date that is biz business days after day1

function bizDaysAfter(biz, day1){
    var start= day1 || new Date(),
    end= new Date(day1), bdiff;

    end.setDate(start.getDate()+biz);
    bdiff= biz-bizDays(start, end);

    while(bdiff>0){
        end.setDate(end.getDate()+bdiff);
        bdiff= biz-bizDays(start, end);
    }
    return end;
}

//Some testing:

var D1= new Date(2013, 3, 25), D2= new Date(2013, 4, 15), 
days=14,
s1=D1.toLocaleDateString(), s2=D2.toLocaleDateString();

['Business days between '+ s1+' and\n'+s2+': '+bizDays(D1,D2)+' days.',
days+' business days after '+s1+':\n'+
bizDaysAfter(days,D1).toLocaleDateString()].join('\n\n');

/*  returned value: (String)
Business days between Thursday, April 25, 2013 and
Wednesday, May 15, 2013: 14 days.

14 business days after Thursday, April 25, 2013:
Wednesday, May 15, 2013
*/
//days count
var days_count = 0;

//start date 
var start = new Date("10/01/2017");

//end date
var end = new Date("10/21/2017");

//holidays array
var date_array = [ new Date('2017-01-26'), new Date('2017-03-13'), new 
Date('2017-03-29'), new Date('2017-08-15'), new Date('2017-08-25'), new 
Date('2017-10-02'), new Date('2017-10-19'), new Date('2017-12-25')];

while(start <= end){
    // 0 = Sunday and 6 = Saturday 
    if(start.getDay() > 0 && start.getDay() < 6){
        days_count = days_count + 1;
        for(var dat in date_array){
        var a = date_array[dat];
        a.setHours(0,0,0,0);
            if(a.getTime() == start.getTime()){
                days_count = days_count - 1;
            }
        }
    }
    var newDate = start.setDate(start.getDate() + 1);
    start = new Date(newDate);
}
console.log(days_count);