如何在Javascript中循环遍历月份

10

我正在尝试使用这里的代码生成一个字符串日期月份列表(例如 ["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 )。 我错过了什么吗?

4个回答

9

使用setMonth()代替setDate()来设置日期变量的月份。

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

7
问题出在你的date.setDate(date.getMonth() + 1)代码中,因为MDN文档说明setDate函数将day设置为指定的Date对象。因此,它不会按照您的意图执行。
为了更好地说明这个问题,date变量被初始化为Mon Oct 13 2014 00:00:00 GMT-0400 (Eastern Daylight Time)。当你调用date.getMonth()时,它返回9,表示日历年份中的第10个月;所以将值增加1会导致将date变量的day设置为10
在下一次迭代中,month没有改变,所以代码重新执行date.getMonth(),它再次返回9,如此循环往复。
由于while条件从未满足,这种意外行为将无限重复。
代码应该更新为使用setMonth

谢谢!setMonth()解决了我的问题。非常清晰明了的解释。 - BoVut

4

使用Moment来完成它:

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

enter image description here

你可以找到两个日期之间的差异。
moment("08-31-2017").diff(moment("01-31-2017"), 'months', true)

enter image description here


0
请勿仅仅将月份加1! 因为每个月的天数都不同,在某些情况下会出现错误。 更安全的方法如下所示:
date.setDate(1);
date.setMonth(date.getMonth() + 1);

你可能会问为什么我们要执行date.setDate(1);? 这是因为每个月的天数不同。如果今天是10月31日,你将月份加1,那么它将变成11月31日。然而,11月31日并不是一个有效的日期...

以下是一个下雨天的例子,说明在这种情况下它会出现问题:

const date = new Date(2022, 9, 31); // Oct 31st
date.setMonth(date.getMonth() + 1);
console.log(date); // It returns "Dec 1st"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接