【问题标题】:HOW do I creating an array of dates between a start and end date?如何在开始日期和结束日期之间创建日期数组?
【发布时间】:2017-07-12 21:27:52
【问题描述】:

我想创建一个从 2014/0/1 到 2020/11/31 的日期列表(日期用 JavaScript 表示)。

这是代码

   var initialTime = new Date(2014, 0, 1); 
   var endTime = new Date( 2050, 11, 31); 

   var arrTime = [];
   arrTime.push(initialTime);

   if( initialTime < endTime) {

    for( var q = initialTime; q <=  endTime; q.setDate(q.getDate() + 1)) {
          arrTime.push(q);

    }            
 }

 document.querySelector("#Time").innerHTML = arrTime;

这是代码返回的内容。它只是“Sun Jan 01 2051 00:00:00 GMT-0500 (EST)”的列表。我该如何纠正?

【问题讨论】:

标签: javascript arrays for-loop if-statement


【解决方案1】:

当您执行q.setTime( ... ) 时,您正在修改Date 对象本身。您在每次迭代时将相同的对象推入数组,因此修改它会修改整个数组。

如果你只想要日期的字符串表示,你可以这样做:

let initialTime = new Date("2018-03-09Z08:00:00")
   ,endTime     = new Date("2018-03-14Z08:00:00")
   ,arrTime     = []
   ;
for (let q = initialTime; q <= endTime; q.setDate(q.getDate() + 1)) {
  arrTime.push(q.toString());
}
console.log(arrTime);

或者,如果您想拥有一组实际的 Date 实例:

let initialTime = new Date("2018-03-09Z08:00:00")
   ,endTime     = new Date("2018-03-14Z08:00:00")
   ,arrTime     = []
   ,dayMillisec = 24 * 60 * 60 * 1000
   ;
for (let q = initialTime; q <= endTime; q = new Date(q.getTime() + dayMillisec)) {
  arrTime.push(q);
}
console.log(arrTime);

【讨论】:

  • 第二个例子中你不需要增加q吗?
【解决方案2】:

首先你不能使用==比较两个日期

第二个问题是每次将一个对象推送到数组 ex 时都需要创建一个新的 Date 对象。 .push(new Date(q.getTime())

下一个问题是在每次推入数组之前,您都没有正确地将最后一天添加到最后一天

做一些类似的事情

伪代码---

 var dates = [];
 while( firstDate < secondDate ){
   // this line modifies the original firstDate reference which you want to make the while loop work
   firstDate.setDate(firstDate.getDate() + 1);
   // this pushes a new date , if you were to push firstDate then you will keep updating every item in the array
   dates.push(new Date(firstDate);
 }

【讨论】:

    【解决方案3】:

    您正在向数组推送相同的内存引用,因此您所做的更改会影响所有这些。

    试试:

    var copiedDate = new Date(q.getTime());
    arrTime.push(copiedDate);
    

    这样你总是推送一个新对象。

    【讨论】:

    • 那只是原代码的问题之一
    【解决方案4】:
    var resolution = 1000, // Number of dates to capture between start and end
      results = [],        // will be populated with the for loop
      start = Date.now(),  // Set to whatever you want
      end = start + (1000 * 60 * 60 * 24), // Set to what ever you want
      delta = end - start
    
    for (let i = 0; i < resolution; i++) {
      let t = (delta / resolution) * i
      results.push(new Date(start + t))
    }
    
    console.log(results)
    

    实时示例:https://jsfiddle.net/5ju7ak75/1/

    【讨论】:

      【解决方案5】:

      短 ES6 解决方案:

      const getDatesInRange = (min, max) => Array((max-min)/86400000).fill(0).map((_, i) => new Date((new Date()).setDate(min.getDate() + i)))
      

      例子

      getDatesInRange(new Date('12-25-2000'), new Date('12-25-2001'))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-05
        相关资源
        最近更新 更多