【问题标题】:store date objects to array将日期对象存储到数组
【发布时间】:2013-09-22 11:12:37
【问题描述】:

我有两个日期,想将中间的天数(加上开始和结束日期)保存在一个数组中

    var date1 = new Date("Sep 23, 2013 12:00:00"); // Monday
    var date2 = new Date("Sep 26, 2013 12:00:00"); // Thursday

    var alldates = [];

    for (var i=0; date1 <= date2; date1.setDate(date1.getDate() + 1), i++) {
        alldates.push(date1);
        }

    alert(alldates.join('\n'));

使用此代码alert(alldates.join('\n')); 显示以下内容

    Fri Sep 27 2013 12:00:00 GMT+0200
    Fri Sep 27 2013 12:00:00 GMT+0200
    Fri Sep 27 2013 12:00:00 GMT+0200
    Fri Sep 27 2013 12:00:00 GMT+0200

我是 Javascript 新手,想进一步了解,所以感谢您解释为什么 alert 不显示

    Mon Sep 23 2013 12:00:00 GMT+0200
    Tue Sep 24 2013 12:00:00 GMT+0200
    Wed Sep 25 2013 12:00:00 GMT+0200
    Thu Sep 26 2013 12:00:00 GMT+0200

【问题讨论】:

    标签: javascript date for-loop


    【解决方案1】:

    您遇到的问题是您将引用推送到date1 对象。当您在循环中更改日期时,您会更新对象,但所有引用仍指向同一个对象。

    您需要推送日期的文本表示形式,或 date1 对象的副本

    for (var i=0; date1 <= date2; date1.setDate(date1.getDate() + 1), i++) {
        alldates.push(new Date(date1));
        }
    
    alert(alldates.join('\n'));
    

    按照建议,使用 while 循环

    while( date1 <= date2 ) {
      alldates.push(new Date(date1));
      date1.setDate( date1.getDate() +1 );
    } 
    

    【讨论】:

    • new Date(date1)就够了,不用.toString()
    【解决方案2】:

    您的数组正在存储单个日期对象的引用,并且每次调用 setDate 时,它​​们中的每一个都会使用新的日期值进行更新。

    所以最好像这样将新的日期对象推送到数组中,

    var date1 = new Date("Sep 23, 2013 12:00:00"); // Monday
    var date2 = new Date("Sep 26, 2013 12:00:00"); // Thursday
    
    var alldates = [];
    // pushing first date
    alldates.push(new Date(date1.setDate(date1.getDate())));
    
    for (var i=0; date1 <= date2; i++) {
    
        alldates.push(new Date(date1.setDate(date1.getDate() + 1)));
    }
    
    alert(alldates.join('\n'));
    

    【讨论】:

      【解决方案3】:

      为了回应其他答案,问题在于被推送到数组的元素不是保持不变的值 - 它指的是在循环中发生变化的 Date 对象,因此所有对 @987654327 的引用存储在alldates 中的@ 被设置为date1 的最终值。

      接受的答案可以完成工作,但它也会改变date1 的值。 OP 设置了具有这种副作用的代码,这表明这对于他们的用例来说不是问题。但是,如果您不想改变 date1,这里有另一种 ES6 风格、无副作用的方法:

      const date1 = new Date("Sep 23, 2013 12:00:00"); // Monday
      const date2 = new Date("Sep 26, 2013 12:00:00"); // Thursday
      const msPerDay = 1000 * 60 * 60 * 24; // 86400000
      const inclusiveDateLength = (date2 - date1) / msPerDay + 1; // 4
      
      const allDates = Array.from(Array(inclusiveDateLength), (_, i) => {
        const newDate = new Date(date1);
        newDate.setDate(date1.getDate() + i);
      
        return newDate;
      });
      
      console.log(allDates.join("\n"));

      说明:我们创建一个数组,将其填充为新的Dates,并用Date.prototype.setDate() 递增每个日期的月份。 Array.from 的一个很酷的特性是它接受 map 函数作为其第二个参数。我们利用 map 函数中的索引值 (i) 来增加每个日期的月份中的第几天 - 请注意,这也适用于环绕,例如 Sep 29Oct 02

      Temporal API 可用时,它可能会为这个问题提供更好的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-21
        • 2019-12-22
        • 1970-01-01
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        相关资源
        最近更新 更多