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

dor*_*emi 42 javascript momentjs

我有两个时刻:

var fromDate = moment(new Date('1/1/2014'));
var toDate   = moment(new Date('6/1/2014'));
Run Code Online (Sandbox Code Playgroud)

片刻是否提供了枚举这两个日期之间所有日期的方法?

如果没有,除了制作一个增加fromDate1 的循环直到它到达时,还有更好的解决方案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;
  };
Run Code Online (Sandbox Code Playgroud)

我跑的时候看一下输出 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) ]
Run Code Online (Sandbox Code Playgroud)

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

gil*_*ly3 76

.add() 是一个mutator方法,所以这行中的赋值是不必要的:

startDate = startDate.add(1, 'days');
Run Code Online (Sandbox Code Playgroud)

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

startDate.add(1, 'days');
Run Code Online (Sandbox Code Playgroud)

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

因此,您的方法调用都不会创建新实例Datemoment对象实例.通过使用.clone()获取新实例来修复它:

startDate = startDate.clone().add(1, 'days');
Run Code Online (Sandbox Code Playgroud)

或者更好的是,在呼叫包裹值moment()甲硝唑暗示的评论,将克隆的实例,如果该值是一个时刻的对象,否则将解析输入来创建一个新的时刻实例.

startDate = moment(startDate).add(1, 'days');
Run Code Online (Sandbox Code Playgroud)

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

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;
};
Run Code Online (Sandbox Code Playgroud)

  • 请注意,不推荐使用`moment().add(句点,数字).请使用moment().add(number,period)`. (10认同)
  • 而不是经典,而我使用"do {} while(condition)"不要跳过第一天 (4认同)

Kyl*_*uir 34

得到它:

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;
};
Run Code Online (Sandbox Code Playgroud)

引用now而不是startDate完全不同.

如果您没有进行包容性搜索,请.isSameOrBefore转到.isBefore

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


小智 10

使用 moment 并使用 while 循环,代码将在循环中运行,直到 startDate 等于 endDate 并推送 startDate,然后将其增加 1 天,以便获得下一个日期

function enumerateDaysBetweenDates (startDate, endDate){
  let date = []
  while(moment(startDate) <= moment(endDate)){
    date.push(startDate);
    startDate = moment(startDate).add(1, 'days').format("YYYY-MM-DD");
  }
  return date;
}
Run Code Online (Sandbox Code Playgroud)

你可以通过调用这样的函数来测试它

let dateArr = enumerateDaysBetweenDates('2019-01-01', '2019-01-10');
Run Code Online (Sandbox Code Playgroud)


小智 9

使用moment libraryandfor loop可以枚举两个日期之间的值。

let startDate = moment('2020-06-21');
let endDate = moment('2020-07-15');
let date = [];

for (var m = moment(startDate); m.isBefore(endDate); m.add(1, 'days')) {
    date.push(m.format('YYYY-MM-DD'));
}

console.log(date)
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)


Cod*_*lan 5

Momentjs本身并不提供此功能,但是有一个插件可以提供此功能:moment-range

具体来说,请查看Iteration docs