最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - get month names between 2 dates - Stack Overflow

programmeradmin0浏览0评论

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?

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?

Share Improve this question asked Jan 29, 2014 at 20:22 Om3gaOm3ga 33k45 gold badges149 silver badges230 bronze badges 3
  • 3 What would you want it to do for diff('September 2013', 'February 2015')? – lurker Commented Jan 29, 2014 at 20:24
  • I want all the month names between those two dates. – Om3ga Commented Jan 29, 2014 at 20:25
  • Do you want duplicated month names was the gist of the question I believe – Dexygen Commented Jan 29, 2014 at 20:36
Add a ment  | 

5 Answers 5

Reset to default 7

Mine is better: http://jsfiddle/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'));

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 ments.

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"]
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.

The following modifies the original function as little as possible, if that helps the OP from a prehension 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"]

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'));
发布评论

评论列表(0)

  1. 暂无评论