如何使用循环中的一系列日期填充Javascript数组?

时间:2017-10-18 20:07:30

标签: javascript arrays date

以下是我正在处理的代码:



    function populateDates() {
      var start = new Date(2017, 7, 13);
      var end = new Date(2017, 8, 3);
      var tempDate = start;
      var endPlus90 = end.setDate(end.getDate() + 90);
      var today = new Date();
      var array = [];
      for(var d = start; d < today || d < endPlus90; d.setDate(d.getDate() + 1)){
        if (d.getDay() !== 0 && d.getDay() !== 6){
          array.push([d]);
        }
      }
      return array;
    }
    var future = new Date();
    future.setDate(future.getDate() + 90);
    console.log(populateDates(new Date(), future));
&#13;
&#13;
&#13;

基本上,我尝试做的是,给定一个任意的开始和结束日期,生成一个日期列表,不包括周末,从开始日期到结束日期后90天或当前日期,以较早者为准。当前函数生成一个数组,该数组是结束日期后90天的所有相同日期。我对Javascript不太熟悉,所以我不确定这里出了什么问题。我怀疑我将变量推送到数组的方式是不正确的。

2 个答案:

答案 0 :(得分:3)

问题在于您使用setDate返回

  

1970年1月1日00:00:00 UTC与给定日期之间的毫秒数(Date对象也在适当位置更改)。   https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate

setDate中包裹new Date()行,您的代码应运行正常。

正如其他人指出数组具有相同日期的倍数的原因是因为您正在推送对同一个日期对象的引用,并重新分配该对象的日期,这更新了每个引用。通过使用new Date()创建新日期,您将创建一个具有自己引用的新对象。

答案 1 :(得分:2)

试一试。您需要每次将d初始化为新日期。您无法更改day。您还需要将new Date()放在end.setDate()附近。 setDate()返回毫秒。

function populateDates(start, end) {
    var tempDate = start;
    var endPlus90 = new Date(end.setDate(end.getDate() + 90));
    var today = new Date();
    var array = [];
    for(var d = tempDate; d < endPlus90; d = new Date(d.setDate(d.getDate() + 1))){ 
      if(d >= today) { // Stop counting dates if we reach the current date
        break;
      } 
      if (d.getDay() !== 0 && d.getDay() !== 6){
        array.push([d]);
      }
    }
    return array;
}

var future = new Date(); // As of 10/18/2017
future.setDate(future.getDate() + 90);
console.log(populateDates(new Date(2017, 9, 1), future)); // Prints 13 days as of 10/18/2017   
console.log(populateDates(new Date(2016, 9, 1), future)); // Prints 273 days