【问题标题】:How do I populate a Javascript array with a series of dates from a loop?如何使用循环中的一系列日期填充 Javascript 数组?
【发布时间】:2017-10-19 06:36:54
【问题描述】:

这是我正在处理的代码:

    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 不是很熟悉,所以我不确定这里出了什么问题。我怀疑我将变量推送到数组的方式不正确。

【问题讨论】:

  • 你试过调试吗?
  • 您能否在 Question 中的函数中包含示例 startend 参数?见stackoverflow.com/help/mcve
  • @giant 敌人间谍,你的问题不清楚。你什么时候需要停止推日期?在结束日期或开始日期后 90 天(哪个更小)?

标签: javascript arrays date


【解决方案1】:

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

【讨论】:

  • 归结为不可变类的哲学。阅读更多关于 Immutable 在 java 中的含义的信息,您将了解代码中发生了什么。 stackoverflow.com/questions/3162665/immutable-class
  • 别忘了说明为什么它总是在结束日期后 90 天打印。
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    相关资源
    最近更新 更多