如何在Javascript中循环几个月

Posted

技术标签:

【中文标题】如何在Javascript中循环几个月【英文标题】:How to loop through months in Javascript 【发布时间】:2015-03-12 04:24:30 【问题描述】:

我正在尝试生成以月为单位的字符串日期列表 (即[“2014 年 10 月”、“2014 年 11 月”、...“2015 年 1 月”]) 在这里使用代码:

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 )时,我从来没有遇到过这个问题。 我在这里遗漏了什么吗?

【问题讨论】:

【参考方案1】:

让我们用Moment 来做吧:

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

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

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

【讨论】:

【参考方案2】:

问题出在您的 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

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

代码应更新为使用setMonth

【讨论】:

谢谢! setMonth() 解决了我的问题。很清楚的解释。【参考方案3】:

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

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

【讨论】:

以上是关于如何在Javascript中循环几个月的主要内容,如果未能解决你的问题,请参考以下文章

一文道尽JavaScript 20年的发展史

JavaScript时间处理之几个月前或几个月后的指定日期

JavaScript时间处理之几个月前或几个月后的指定日期

如何在 Nightwatch 测试的自定义命令中添加嵌套函数 javascript - forEach - 循环遍历元素

使用javascript循环读取JSON数字数组[重复]

如何按列剩余的几个月和几天对列进行排序