Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to loop through months in Javascript

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

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?

like image 274
BoVut Avatar asked Jan 14 '15 03:01

BoVut


3 Answers

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

date.setMonth(date.getMonth() + 1);
like image 100
hyperbeam22 Avatar answered Oct 11 '22 12:10

hyperbeam22


The problem is within your date.setDate(date.getMonth() + 1) code as the MDN documentation states the setDate function sets the day to the specified Date object. Therefore, it's not behaving as you had intended.

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

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

The code should be updated to use setMonth instead.

like image 24
Anthony Forloney Avatar answered Oct 11 '22 11:10

Anthony Forloney


Lets do it using 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

like image 3
Sufiyan Ansari Avatar answered Oct 11 '22 12:10

Sufiyan Ansari