在Javascript中获得下一个12个月的结果是混乱的

Result of getting next 12 months in Javascript is messed up

本文关键字:结果是 混乱 12个 下一个 Javascript      更新时间:2023-09-26

我有以下代码用于生成从今天开始的下一个 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;
    };
}

调用getNext12MonthNamesWithYear()的结果是:

  • 《2012年5月》
  • 《2012年7月》
  • 《2012年8月》
  • 《2012年5月》
  • 《2012年7月》
  • 《2012年8月》
  • 《2012年9月》
  • 《2012年10月》
  • 《2012年11月》
  • "2012年12月"
  • "2013年1月"
  • "2013年2月"
  • 《2013年3月》
  • "2013年4月"
  • "2013年5月"

如您所愿,列表的开头有点奇怪,因为缺少"六月",加上"五月","七月"和"八月"出现了两次。

当然,我在这里做错了什么;有人可以帮帮我吗?

编辑:

根据micadelli的评论,这是我使用的解决方案:

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);
            tmpYear = (tmpMonth == 11) ? tmpYear + 1 : tmpYear;
            tmpMonth = (tmpMonth == 11) ? 0 : tmpMonth + 1;
        }
        return months;
    };
}

不要试图操作Date对象 - 只需使用它来获取月份和年份的初始值,然后对结果使用简单的算术:

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;
}

在 http://jsfiddle.net/alnitak/SQQdg/的工作演示

这是我

使用Moment的解决方案.js

未来 12 个月

let months = [];
let monthsRequired = 12
for (let i = 1; i <= monthsRequired; i++) {
  months.push( moment().add(i, 'months').format('MMMM YYYY') )
}
console.log(months)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

以防万一,如果您需要前 12 个月

let months = [];
let monthsRequired = 12
for (let i = monthsRequired; i >= 1; i--) {
  months.push( moment().subtract(i, 'months').format('MMMM YYYY') )
}
console.log(months)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

我看不出有任何理由为什么这不起作用

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;
   };
}

简斌
http://jsbin.com/aqezom

这是一个工作版本。如果值大于 12,则无法直接执行 setMonth。此外,在某些月份没有第 31 个,这会导致意外结果。JS小提琴在这里小提琴

    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";
var today = new Date();
var currentMonth = today.getMonth();
var i;
for (i = 0 ; i < 12 ; i++) {
    var newMonth = currentMonth + i;
    var newYear = newMonth > 11 ? today.getFullYear() + 1: today.getFullYear();
    newMonth = newMonth > 11? (newMonth - 12): newMonth;
    var newDate = new Date(newYear, newMonth, '1');
    console.log(monthNames[newDate.getMonth()] + ' ' + newDate.getFullYear());
}
​

我还需要过去 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;
    }
}