MomentJS可能存在add()函数的错误

时间:2016-05-25 08:10:05

标签: javascript date momentjs

我想在数组中添加几个月,但是我无法让MomentJS的add()函数正常工作。这是怎么回事:

    function getMonths(begin, end){
        var cursor = moment(begin);
        var momentEnd = moment(end);
        var arrayMonths = [];
        while(cursor.month() != momentEnd.month() || cursor.year() != momentEnd.year()){        
            cursor.add(1, 'month'); // Actually adds one month to the cursor
            console.log(cursor.toDate()); // Because this display the cursor with an added month
            arrayMonths.push(cursor.toDate()); // However the cursor being pushed doesn't have this added month
            console.log(arrayMonths); // verified here
        }       
        return arrayMonths;
    }

控制台日志显示游标实际上已经增加(因为add()是一个mutator)但是它的正确值没有被添加到数组中。

我无法弄清楚这是我的代码中的问题还是MomentJS固有的问题。有人有任何线索吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

toDate的文档说:

  

要获取Moment.js包装的本机Date对象,请使用#adDate。

     

这将返回当前使用的日期,因此对该日期的任何更改都将导致时刻发生变化。如果您想要一个作为副本的日期,请在使用#toDate时刻之前使用#cron。

IE每次拨打Date时,您都会获得相同的基础toDate对象 - 即每次调用add也会修改它,并且数组的每个成员实际上都是同一个对象。

如果您按照文档说的那样操作,并使用clone,则代码可以正常运行:

arrayMonths.push(cursor.clone().toDate());

这是一个演示:



function getMonths(begin, end){
  var cursor = moment(begin);
  var momentEnd = moment(end);
  var arrayMonths = [];
  while(cursor.month() != momentEnd.month() || cursor.year() != momentEnd.year()){        
    cursor.add(1, 'month'); // Actually adds one month to the cursor
    console.log(cursor.toDate()); // Because this display the cursor with an added month
    
    //clone the object before pushing, to ensure it's not further modified
    arrayMonths.push(cursor.clone().toDate()); 
    
    console.log(arrayMonths); // verified here
  }       
  return arrayMonths;
}
    
    
getMonths(moment('2016/01/01', 'YYYY/MM/DD'), moment('2017/01/01', 'YYYY/MM/DD'));

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:-1)

由于您的代码看起来不错,不完全确定这里发生了什么。

然而,我会尝试使用临时变量来仔细检查发生了什么。

function getMonths(begin, end){
    var cursor = moment(begin);
    var momentEnd = moment(end);
    var arrayMonths = [];
    while(cursor.month() != momentEnd.month() || cursor.year() != momentEnd.year()){        
        cursor.add(1, 'month');
        var cursorDate = cursor.toDate();
        console.log(cursorDate); // temporary variable - no chance it gets mutated etc...
        arrayMonths.push(cursorDate); 
        console.log(arrayMonths);
    }       
    return arrayMonths;
}