如何在 Javascript 中循环几个月

How to loop through months in Javascript

我正在尝试生成以月为单位的字符串日期列表 (即 ["Oct 2014"、"Nov 2014"、..."Jan 2015"]) 使用此处的代码:

var resultList = [];
var date = new Date("October 13, 2014");
var endDate = new Date("January 13, 2015");
var monthNameList = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

while (date <= endDate)
{
    var stringDate = monthNameList[date.getMonth()] + " " + date.getFullYear();
    resultList.push(stringDate);
    date.setDate(date.getMonth() + 1);
}

return resultList;

但是当我 运行 代码时,屏幕被冻结了(好像是无限循环之类的)。 当我生成每日日期(即 date.getDate() +1 )时,我从来没有遇到过这个问题。 我在这里遗漏了什么吗?

问题出在您的 date.setDate(date.getMonth() + 1) 代码中,因为 MDN 文档指出 setDate 函数将 day 设置为指定的 Date 对象.因此,它没有按照您的预期运行。

为了更好地说明问题,将date变量初始化为Mon Oct 13 2014 00:00:00 GMT-0400 (Eastern Daylight Time)。当你调用date.getMonth()时,它returns 9表示日历年的第10个月;因此将值增加 1 会导致将 date 变量的 day 设置为 10

在下一次迭代中,月份没有改变,所以代码重新执行date.getMonth() which returns 9 ,等等等等。 由于永远不会满足 while 条件,这种意外行为会不断重复。

代码应更新为使用 setMonth

使用 setMonth() 而不是 setDate() 来设置日期变量的月份。

date.setMonth(date.getMonth() + 1);

让我们使用 Moment 来做到这一点:

moment(sd).add(1,'month').format("MMM-YY")

您可以找到两个日期之间的差异

moment("08-31-2017").diff(moment("01-31-2017"), 'months', true)