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")
}));
});
非常感谢您的帮助
由于某些奇怪的原因,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")
}));
});
非常感谢您的帮助