如何枚举Moment中两个日期之间的日期

新手上路,请多包涵

我有两个 时刻 日期:

 var fromDate = moment(new Date('1/1/2014'));
var toDate   = moment(new Date('6/1/2014'));

moment 是否提供了一种方法来枚举这两个日期之间的所有日期?

如果没有,除了制作一个循环将 fromDate 递增 1 直到它到达 toDate 之外,还有什么更好的解决方案吗?

编辑:添加日期枚举方法和问题

我模拟了一种枚举两个日期之间的天数的方法,但我遇到了一个问题。

   var enumerateDaysBetweenDates = function(startDate, endDate) {
    var dates = [];

    startDate = startDate.add(1, 'days');

    while(startDate.format('M/D/YYYY') !== endDate.format('M/D/YYYY')) {
      console.log(startDate.toDate());
      dates.push(startDate.toDate());
      startDate = startDate.add(1, 'days');
    }

    return dates;
  };

看一下我运行时的输出 enumerateDaysBetweenDates( moment(new Date('1/1/2014')), moment(new Date('1/5/2014'));

 Thu Jan 02 2014 00:00:00 GMT-0800 (PST)
Fri Jan 03 2014 00:00:00 GMT-0800 (PST)
Sat Jan 04 2014 00:00:00 GMT-0800 (PST)
[ Sun Jan 05 2014 00:00:00 GMT-0800 (PST),
  Sun Jan 05 2014 00:00:00 GMT-0800 (PST),
  Sun Jan 05 2014 00:00:00 GMT-0800 (PST) ]

它是 console.logging 正确的日期,但只有最终日期被添加到数组中。这是怎么/为什么?这听起来像是某种变量引用问题 - 但我没有看到它。

原文由 doremi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 837
2 个回答

.add() 是一个增变器方法,因此这一行中的赋值是不必要的:

 startDate = startDate.add(1, 'days');

你可以这样做,并具有相同的效果:

 startDate.add(1, 'days');

虽然它的名字意味着创建一个新的 Date 对象, toDate() 方法实际上只返回现有的内部 Date

因此,您的方法调用都没有创建新的 Datemoment 对象实例。通过使用 .clone() 获取新实例来修复该问题:

 startDate = startDate.clone().add(1, 'days');

或者更好的是,将值包装在对 moment() 的调用中,正如 Mtz 在评论中所建议的那样,如果该值是 moment 对象,它将克隆实例,否则它将解析输入以创建一个新的时刻实例。

 startDate = moment(startDate).add(1, 'days');

我认为日期枚举器方法不应更改传入的任何一个参数。我会创建一个单独的变量来进行枚举。我也会直接比较日期,而不是比较字符串:

 var enumerateDaysBetweenDates = function(startDate, endDate) {
    var dates = [];

    var currDate = moment(startDate).startOf('day');
    var lastDate = moment(endDate).startOf('day');

    while(currDate.add(1, 'days').diff(lastDate) < 0) {
        console.log(currDate.toDate());
        dates.push(currDate.clone().toDate());
    }

    return dates;
};

原文由 gilly3 发布,翻译遵循 CC BY-SA 3.0 许可协议

为你准备好了:

 var enumerateDaysBetweenDates = function(startDate, endDate) {
    var now = startDate.clone(), dates = [];

    while (now.isSameOrBefore(endDate)) {
        dates.push(now.format('M/D/YYYY'));
        now.add(1, 'days');
    }
    return dates;
};

引用 now 而不是 startDate 让一切变得不同。

如果您不在进行包容性搜索,则将 .isSameOrBefore 更改为 .isBefore

小提琴:http: //jsfiddle.net/KyleMuir/sRE76/118/

原文由 Kyle Muir 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题