获取带有JS时刻的两个日期之间的月份的开始和结束列表

时间:2018-07-16 14:45:24

标签: javascript momentjs

我有2个这样的约会

2018-01-012019-01-01

我想返回这两个日期之间所有月份的列表,但是像这样在列表中同时获得月份的开始和结束

 2018-01-01 - 2018-01-31
 2018-02-01 - 2018-02-28
 2018-03-01 - 2018-03-31

,以此类推,直到两个日期之间的所有月份都如此。我如何用Moment JS做到这一点?

3 个答案:

答案 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')
}

正如其他用户指出的那样,当您使用momentstartOf之类的方法时,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>