如何通过循环在Javascript数组中填充一系列日期?

3

这是我正在处理的代码:

    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));

基本上,我要做的是,根据任意的开始和结束日期,生成一个日期列表,排除周末,在开始日期到结束日期后90天或当前日期之前(以早者为准)之间。当前函数生成了一个数组,该数组中所有的日期都与结束日期相差90天。由于我对Javascript不是很熟悉,所以我不确定出了什么问题。我怀疑我将变量推送到数组的方式是错误的。


你尝试过调试吗? - Observer
你能否在问题的函数中包含示例startend参数?请参阅https://stackoverflow.com/help/mcve - guest271314
@giant enemy spycrab,您的问题不太清楚。您何时需要停止推迟日期?是在结束日期还是开始日期后90天(以较小者为准)? - Observer
2个回答

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() 创建一个新的日期对象,您正在创建一个具有自己引用的新对象。

这归结于不可变类的哲学。阅读一些关于Java中Immutable的含义的内容,你就会理解在你的代码中发生了什么。https://dev59.com/mHA75IYBdhLWcg3wrrJS - Kieveli
不要忘记解释为什么它会在结束日期之后始终打印90天。 - Jimenemex

2

试试这个。每次需要将d初始化为一个新的日期,你不能只是改变day。同时你还需要在end.setDate()周围加上new Date()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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接