【问题标题】:Getting list of dates between two dates not returning correctly JS获取两个日期之间的日期列表未正确返回 JS
【发布时间】:2017-11-03 19:56:58
【问题描述】:

我有一个开始日期和一个结束日期,并且我想生成一个介于(包括)这两个日期之间的日期列表。但我不明白为什么它不起作用......

我传入了几个 JS 日期对象,我在下面的控制台中显示了它们记录的内容

function dateList(dateStart, dateEnd) {
  console.log(dateStart);
  console.log(dateEnd);
  var dates = [];
  for ( i = dateStart; i <= dateEnd; i.setDate(i.getDate() + 1) ){
    dates.push(i);
  }
  return dates
}



Mon May 08 2017 00:00:00 GMT+0100 (BST)
Fri May 12 2017 00:00:00 GMT+0100 (BST)

返回的数组是

Array[5] 
0: Sat May 13 2017 00:00:00 GMT+0100 (BST)
1: Sat May 13 2017 00:00:00 GMT+0100 (BST)
2: Sat May 13 2017 00:00:00 GMT+0100 (BST)
3: Sat May 13 2017 00:00:00 GMT+0100 (BST)
4: Sat May 13 2017 00:00:00 GMT+0100 (BST)
length: 5
__proto__: Array[0]

...为什么???......

【问题讨论】:

  • 您在每次迭代中更改i,并且每次都向数组添加对i 的引用。所以数组中的所有元素都是一样的。
  • 这里有一些东西可以帮助你,为 Arg0n 所说的添加上下文:stackoverflow.com/questions/4345045/…

标签: javascript date


【解决方案1】:

尝试添加new Date(i),而不仅仅是i

function dateList(dateStart, dateEnd) {
  var dates = [];
  for (i = dateStart; i <= dateEnd; i.setDate(i.getDate() + 1)){
    dates.push(new Date(i));
  }
  return dates;
}

console.log(dateList(new Date('2017-05-08'), new Date('2017-05-12')));

【讨论】:

  • 使用var i = new Date(dateStart) 可能会更好。 startDate 被传递给函数,所以最好不要在循环中修改它。 ;-)
【解决方案2】:

您的代码 i.setDate(i.getDate() + 1) 不会创建新日期 - 它只是一遍又一遍地更新同一个 Date 对象。然后将该对象推送到数组中,该数组会推送对该对象的引用,而不是该对象的副本。

一种解决方案是在循环内创建一个new Date() 并设置它的值,然后将这个新日期推送到您的数组中。

【讨论】:

    【解决方案3】:

    因为同一个对象被修改了所有引用同一个对象的元素

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2018-09-17
      • 1970-01-01
      • 2018-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-25
      • 1970-01-01
      相关资源
      最近更新 更多