我有以下代码,用于生成从今天开始的下一个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()
的结果是:
尽可能地,列表的开头有点奇怪,因为“June”缺失,加上“May”,“July”和“August”出现两次。
当然,我在这里做错了;有人可以帮帮我吗?
编辑:
基于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;
};
}
答案 0 :(得分:7)
不要试图操纵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;
}
的工作演示
答案 1 :(得分:4)
我没有看到为什么这不起作用
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;
};
}
JS Bin
http://jsbin.com/aqezom
答案 2 :(得分:3)
这是一个工作版本。如果值大于12,则无法直接执行setMonth。此外,某些月份没有31st会导致意外结果。 JS在这里摆弄FIDDLE
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());
}
答案 3 :(得分:3)
以下是使用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)
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
&#13;
万一您需要之前的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)
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
&#13;
答案 4 :(得分:1)
我还需要过去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;
}
}