Om3ga
Om3ga

Reputation: 32863

get month names between 2 dates

I have to two dates from and to. I want to get all of the month names between these two dates.

Following is my code

var monthNames = [ "January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December" ];

function diff(from, to) {
    var datFrom = new Date('1 ' + from);
    var datTo = new Date('1 ' + to);
    var arr = monthNames.slice(datFrom.getMonth(), datTo.getMonth() + 1);
}

above code works for following inputs

diff('September 2013', 'December 2013');

but it does not work for this

diff('September 2013', 'February 2014');

How can I make it work?

Upvotes: 3

Views: 6335

Answers (5)

J.P. Armstrong
J.P. Armstrong

Reputation: 836

Mine is better: http://jsfiddle.net/kS73f/8/

var monthNames = [ "January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December" ];

function diff(from, to) {
    var arr = [];
    var datFrom = new Date('1 ' + from);
    var datTo = new Date('1 ' + to);
    var fromYear =  datFrom.getFullYear();
    var toYear =  datTo.getFullYear();
    var diffYear = (12 * (toYear - fromYear)) + datTo.getMonth();

    for (var i = datFrom.getMonth(); i <= diffYear; i++) {
        arr.push(monthNames[i%12] + " " + Math.floor(fromYear+(i/12)));
    }        

    return arr;
}

console.log(diff('September 2013', 'March 2014'));

Upvotes: 7

Slobodan Stojanovic
Slobodan Stojanovic

Reputation: 174

var monthNames = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ];

function diff(from, to) {
    var datFrom = new Date('1 ' + from);
    var datTo = new Date('1 ' + to);
    var arr;
    if(datFrom > datTo) {
      return diff(to, from);
    }

    var fromYear = datFrom.getFullYear();
    var toYear = datTo.getFullYear();

    if(fromYear === toYear) {
      return monthNames.slice(datFrom.getMonth(), datTo.getMonth() + 1);
    } else {
      var arr = addYear(monthNames.slice(datFrom.getMonth(), new Date('1 December ' + fromYear)), fromYear);
      for(var i = 1; i < (toYear - fromYear); i++) {
        arr = arr.concat(addYear(monthNames, fromYear + i));
      }
      return arr.concat(addYear(monthNames.slice(new Date('1 January ' + fromYear).getMonth(), datTo.getMonth() + 1), toYear));
    }
}

function addYear(arr, year) {
  var updatedArr = [];
  for(var i = 0; i < arr.length; i++) {
    updatedArr[i] = arr[i] + ' ' + year;
  }
  return updatedArr;
}

Than try console.log(diff('September 2013', 'February 2015')) to test it.

Upvotes: 0

Dexygen
Dexygen

Reputation: 12561

The following modifies the original function as little as possible, if that helps the OP from a comprehension standpoint.

function diff(from, to) {
    var datFrom = new Date('1 ' + from);
    var datTo = new Date('1 ' + to);
    var arr = monthNames.slice(datFrom.getMonth(), datTo.getMonth() + 1);

    if (!arr.length) {
        arr = monthNames.slice(datFrom.getMonth(), 12);
        arr = arr.concat(monthNames.slice(0, datTo.getMonth() + 1));
    }

    return arr;
}

console.log(diff('December 2013', 'February 2014')); //["September", "October", "November", "December", "January", "February"]

Upvotes: -1

James
James

Reputation: 22247

Lazy answer:

var monthNames = [ "January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December", 
        "January", "February", "March", "April", "May", "June",
        "July", "August", "September", "October", "November", "December" ];

function diff(from, to) {
    var mFrom = new Date('1 ' + from).getMonth();
    var mTo = new Date('1 ' + to).getMonth();
    mTo = mTo < mFrom ? mTo + 12 : mTo;
    return monthNames.slice(mFrom, mTo + 1);
}

alert(diff('September 2013', 'December 2013'));
alert(diff('September 2013', 'February 2014'));

Upvotes: -2

megawac
megawac

Reputation: 11353

You're going to have to do a more manual method than slice. Here's a starting point you can determine how to handle cases as mentioned in comments.

function diff(from, to) {
    var result = [];
    var datFrom = new Date('1 ' + from);
    var datTo = new Date('1 ' + to);
    if(datFrom < datTo) {
      var month = datFrom.getMonth();
      var toMonth = datTo.getMonth() + 1 + ((datTo.getYear() - datFrom.getYear())*12); //toMonth adjusted for year
      for(; month < toMonth; month++) { //Slice around the corner...
        result.push(monthNames[month % 12]);
      }
    }

    return result;
}

diff('September 2013', 'February 2014'); //=["September", "October", "November", "December", "January", "February"]

Upvotes: 1

Related Questions