我有2个这样的约会
2018-01-01
和2019-01-01
我想返回这两个日期之间所有月份的列表,但是像这样在列表中同时获得月份的开始和结束
2018-01-01 - 2018-01-31
2018-02-01 - 2018-02-28
2018-03-01 - 2018-03-31
,以此类推,直到两个日期之间的所有月份都如此。我如何用Moment JS做到这一点?
答案 0 :(得分:4)
只是一个小的可运行样本。小心moment.js:瞬间发生变化!
希望这对您有所帮助!
const format = 'YYYY-MM-DD';
const start = moment('2018-01-01', format), end = moment('2019-01-01', format);
const result = [];
while(start.isBefore(end)) {
result.push({
start: start.startOf('month').format(format),
end: start.endOf('month').format(format)
});
start.add(1, 'month');
}
console.log(result);
<script src="https://momentjs.com/downloads/moment.min.js"></script>
答案 1 :(得分:1)
我会选择这样的东西:
var start = moment('2018-01-01', 'YYYY-MM-DD')
var end = moment('2019-01-01', 'YYYY-MM-DD')
while (start < end) {
console.log(start.startOf('month').format('YYYY-MM-DD'))
console.log(start.endOf('month').format('YYYY-MM-DD'))
start.add(1, 'month')
}
正如其他用户指出的那样,当您使用moment
和startOf
之类的方法时,endOf
的对象会发生突变,因此您应该考虑像这样克隆它们:
var startOfMonth = start.clone().startOf('month')
// ... and so on
答案 2 :(得分:0)
如果有兴趣使用moment-range
plugin,请使用range.by
获取范围。
window['moment-range'].extendMoment(moment);
var dateformat = "DD/MM/YYYY", start = moment("01/01/2018",dateformat), end = moment("01/12/2018",dateformat);
var range = moment.range(start,end);
var result = Array.from(range.by("month")).map(function(val){
return [val.startOf("month").format(dateformat),val.endOf("month").format(dateformat)];
})
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-range/4.0.1/moment-range.js"></script>