MomentJS 范围并不总是包括日期范围内的当前月份

MomentJS range not always including current month in date range

由于某些奇怪的原因,MomentJS 范围并不总是显示当前月份。我想知道是否需要设置一个选项,以便它在日期范围内包含当前月份。

这是用于生成日期范围的代码。我还附上了一个代码笔,这样你就可以看到它的实际效果。

http://codepen.io/anon/pen/rORmxY

    //momentJs creates the ranges
    //Only shows April 2015
    var end = moment("2015-05-01","YYYY-MM-DD");
    //where the day is > 18 it Shows May 2015
    var end2 = moment("2015-05-19","YYYY-MM-DD");
    var start = moment().subtract(1.5, "year");
    var range = moment.range(start, end); 
    var range2 = moment.range(start, end2); 

    //iterate through the months, and populate the SELECT box
    range.by('months', function(date) {
      //add those values to a SELECT box
      $('#month-range').prepend($('<option>', {
        value: date.format("MMM YYYY"),
        text: date.format("MMM YYYY")
      }));
    });

   //iterate through the months, and populate the SELECT box
    range2.by('months', function(date) {
      //add those values to a SELECT box
      $('#month-range2').prepend($('<option>', {
        value: date.format("MMM YYYY"),
        text: date.format("MMM YYYY")
      }));
    });

非常感谢

请查看month-range(https://github.com/gf3/moment-range/blob/master/lib/moment-range.js)的源代码。

将结束日期设置为 2015-05-18 会比 2015-05-19 少一个月的原因没什么特别的。因为今天是2015-11-18,你设置的开始日期是2014-05-18

现在看看 moment-range 中的 _byString 函数(由 'by' 函数调用)。

function _byString(interval, hollaback, exclusive) {
  var current = moment(this.start);

  while (this.contains(current, exclusive)) {
    hollaback.call(this, current.clone());
    current.add(1, interval);
  }
}

'current'变量从'2014-05-18'开始,每次增加一个月。 如果结束日期是 2015-05-19,当 'current' = '2015-05-18' 时,'this.contains()' 只是 return 为真。如果结束日期是 2015-05-19,'this.contains' 将 return 为假。这就是您的代码行为的原因。

现在,如果您想始终包括当前月份,我想您总是要在结束日期前加上 1 天。但是,我认为这种方法可能会在一个月的最后一天引起一些问题。或者您始终可以将结束日期设置为下个月的第一天,但​​不包括该月。你可以做一些实验。

希望对您有所帮助!

我发现的解决方法是简单地告诉 momentJs 使用月末作为范围。在这种情况下这是有道理的。这是通过将 .endOf("month") 添加到结束范围来完成的。

请参阅此代码进行说明:

//momentJs creates the ranges
//adding .endOf("month") will Include the month of May in the month ranges
var end = moment("2015-05-01","YYYY-MM-DD").endOf("month");
var start = moment().subtract(1.5, "year");
var range = moment.range(start, end); 

//iterate through the months, and populate the SELECT box
range.by('months', function(date) {
  //add those values to a SELECT box
  $('#month-range').prepend($('<option>', {
    value: date.format("MMM YYYY"),
    text: date.format("MMM YYYY")
  }));
});

非常感谢您的帮助