接下来12个月使用Javascript的结果是一团糟

接下来12个月使用Javascript的结果是一团糟,javascript,date,Javascript,Date,我有以下代码来生成从今天开始的未来12个月(含12个月)的列表: function DateUtilFunctions() { var self = this; var monthNames = new Array(); monthNames[0] = "January"; monthNames[1] = "February"; monthNames[2] = "March"; monthNames[3] = "April"; mont

我有以下代码来生成从今天开始的未来12个月(含12个月)的列表:

function DateUtilFunctions() {
    var self = this;

    var monthNames = new Array();

    monthNames[0] = "January";
    monthNames[1] = "February";
    monthNames[2] = "March";
    monthNames[3] = "April";
    monthNames[4] = "May";
    monthNames[5] = "June";
    monthNames[6] = "July";
    monthNames[7] = "August";
    monthNames[8] = "September";
    monthNames[9] = "October";
    monthNames[10] = "November";
    monthNames[11] = "December";

    self.getNext12MonthNamesWithYear = function () {
        var months = new Array();
        var today = new Date(Date());

        var loopDate = new Date();
        loopDate.setTime(today.valueOf());

        var todayPlus12Months = new Date(today.setMonth(today.getMonth() + 12));

        while (loopDate.valueOf() < todayPlus12Months.valueOf()) {
            alert(loopDate);
            alert(loopDate.getMonth());
            var month = monthNames[loopDate.getMonth()];


            months.push(month + ' ' + loopDate.getFullYear());
            loopDate.setMonth(loopDate.getMonth() + 1);
        }

        return months;
    };
}

我看不出这有什么不起作用的原因

function DateUtilFunctions() {
   var self = this;

   var monthNames = new Array();

   monthNames[0] = "January";
   monthNames[1] = "February";
   monthNames[2] = "March";
   monthNames[3] = "April";
   monthNames[4] = "May";
   monthNames[5] = "June";
   monthNames[6] = "July";
   monthNames[7] = "August";
   monthNames[8] = "September";
   monthNames[9] = "October";
   monthNames[10] = "November";
   monthNames[11] = "December";

   self.getNext12MonthNamesWithYear = function () {
     var months = new Array();
     var today = new Date();
     var tmpDate = new Date();
     var tmpYear = tmpDate.getFullYear();
     var tmpMonth = tmpDate.getMonth();
     var monthLiteral;

     for (var i = 0 ; i < 12 ; i++) {
        tmpDate.setMonth(tmpMonth + i);
        tmpDate.setFullYear(tmpYear);
        monthLiteral = monthNames[tmpMonth];
        months.push(monthLiteral + ' ' + tmpYear);
        tmpMonth = (tmpMonth == 11) ? 0 : tmpMonth+1;
        tmpYear = (tmpMonth == 11) ? tmpYear+1 : tmpYear;
     }

     return months;
   };
}
函数DateUtilFunctions(){ var self=这个; var monthNames=新数组(); monthNames[0]=“一月”; monthNames[1]=“二月”; monthNames[2]=“三月”; monthNames[3]=“四月”; monthNames[4]=“五月”; monthNames[5]=“六月”; monthNames[6]=“7月”; monthNames[7]=“八月”; monthNames[8]=“9月”; monthNames[9]=“10月”; monthNames[10]=“11月”; monthNames[11]=“12月”; self.getNext12MonthNamesWithYear=函数(){ var months=新数组(); var today=新日期(); var tmpDate=新日期(); var tmpYear=tmpDate.getFullYear(); var tmpMonth=tmpDate.getMonth(); var每月一次; 对于(变量i=0;i<12;i++){ tmpDate.setMonth(tmpMonth+i); tmpDate.setFullYear(tmpYear); 月数=月数[tmpMonth]; 月推(每月+月推+tmpYear); tmpMonth=(tmpMonth==11)?0:tmpMonth+1; tmpYear=(tmpMonth==11)?tmpYear+1:tmpYear; } 返回月份; }; } JS-Bin

这是一个工作版本。如果值大于12,则不能直接执行setMonth。此外,在某些月份也没有出现会导致意外结果的情况。 我在这儿拉小提琴

var monthNames=new Array();
monthNames[0]=“一月”;
monthNames[1]=“二月”;
monthNames[2]=“三月”;
monthNames[3]=“四月”;
monthNames[4]=“五月”;
monthNames[5]=“六月”;
monthNames[6]=“7月”;
monthNames[7]=“八月”;
monthNames[8]=“9月”;
monthNames[9]=“10月”;
monthNames[10]=“11月”;
monthNames[11]=“12月”;
var today=新日期();
var currentMonth=today.getMonth();
var i;
对于(i=0;i<12;i++){
var newMonth=currentmount+i;
var newYear=newMonth>11?今天.getFullYear()+1:今天.getFullYear();
newMonth=newMonth>11?(newMonth-12):newMonth;
var newDate=新日期(新年、新月份,'1');
log(monthNames[newDate.getMonth()]+''+newDate.getFullYear());
}
​

不要试图操纵
日期
对象-只需使用它获取月份和年份的初始值,然后对结果使用简单的算术运算即可:

function getNext12MonthNamesWithYear() {
    var now = new Date();
    var month = now.getMonth();
    var year = now.getFullYear();

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

    var res = [];
    for (var i = 0; i < 13; ++i) {
        res.push(names[month] + ' ' + year);
        if (++month === 12) {
            month = 0;
            ++year;
        }
    }
    return res;
}
函数getNext12MonthNamesWithYear(){
var now=新日期();
var month=now.getMonth();
var year=now.getFullYear();
变量名称=['一月','二月','三月','四月','五月','六月',
“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”];
var-res=[];
对于(变量i=0;i<13;++i){
res.push(名称[月份]+''+年份);
如果(++月份===12){
月份=0;
++年份;
}
}
返回res;
}

进行演示时,我还需要一份过去12个月的清单这就是我所做的:

var theMonths = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var today = new Date();
var aMonth = today.getMonth();
var i;
for (i=0; i<12; i++) {
    document.writeln(theMonths[aMonth] + '<br>'); //here you can do whatever you want...
    aMonth++;
    if (aMonth > 11) {
        aMonth = 0;
    }
}
var theMonths=新数组(“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”、“十月”、“十一月”、“十二月”);
var today=新日期();
var aMonth=today.getMonth();
var i;
对于(i=0;i 11){
aMonth=0;
}
}

这是我使用

未来12个月
let months=[];
让monthsRequired=12

对于(让i=1;我尝试了你的解决方案-几乎正确,除了“2012年7月”出现两次。我看不出有任何理由这样做。你能解释一下你的代码是什么吗?不必要的复杂,我有一个库,比如感谢你建议的“矩.js”。虽然我使用了不同的方法,但我会把这个js保留在我的工具列表中。不必要的复杂,我也可以跳过计数器,只做
名称[(月+i)%12]
年+(i/12 | 0)
@minitech是的,那会有用,但我是为了简单和清晰。@Alnitak-+1谢谢你的建议,我真的很喜欢清晰。
function getNext12MonthNamesWithYear() {
    var now = new Date();
    var month = now.getMonth();
    var year = now.getFullYear();

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

    var res = [];
    for (var i = 0; i < 13; ++i) {
        res.push(names[month] + ' ' + year);
        if (++month === 12) {
            month = 0;
            ++year;
        }
    }
    return res;
}
var theMonths = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var today = new Date();
var aMonth = today.getMonth();
var i;
for (i=0; i<12; i++) {
    document.writeln(theMonths[aMonth] + '<br>'); //here you can do whatever you want...
    aMonth++;
    if (aMonth > 11) {
        aMonth = 0;
    }
}