如何在 Javascript 中循环使用几个月

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27935267/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 08:11:31  来源:igfitidea点击:

How to loop through months in Javascript

javascriptdatewhile-loop

提问by BoVut

I'm trying to generate a list of string dates in months (i.e. ["Oct 2014", "Nov 2014",... "Jan 2015" ]) using the code here:

我正在尝试使用此处的代码生成以月为单位的字符串日期列表(即 ["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;

But when I run the code, the screen was frozen (like it was endless loop or something). I never have this problem when I generate daily date (i.e. date.getDate() +1 ). Am I missing something here?

但是当我运行代码时,屏幕被冻结(就像它是无限循环或其他东西)。当我生成每日日期(即 date.getDate() +1 )时,我从来没有遇到过这个问题。我在这里错过了什么吗?

采纳答案by Anthony Forloney

The problem is within your date.setDate(date.getMonth() + 1)code as the MDN documentation states the setDatefunction sets the dayto the specified Dateobject. Therefore, it's not behaving as you had intended.

问题出在您的date.setDate(date.getMonth() + 1)代码中,因为 MDN 文档指出该setDate函数将日期设置为指定的Date对象。因此,它的行为不符合您的预期。

To better illustrate the problem, the datevariable is initialized as Mon Oct 13 2014 00:00:00 GMT-0400 (Eastern Daylight Time). When you call date.getMonth()it returns 9indicating the 10th month in the calendar year; so incrementing the value by 1 results in setting the dayof the datevariable to 10.

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

On the next iteration, the monthhasn't changed, so the code re-executes date.getMonth()which returns 9again, so on and so on. This unexpected behavior continues to repeat endlessly as the whilecondition is never satisfied.

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

The code should be updated to use setMonthinstead.

应更新代码以改为使用setMonth

回答by frosdqy

Use setMonth()instead of setDate()to sets the month of the date variable.

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

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

回答by Sufiyan Ansari

Lets do it using Moment:

让我们使用Moment来做:

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

enter image description here

在此处输入图片说明

You can find a difference between two dates

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

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

enter image description here

在此处输入图片说明