在Javascript中获得下一个12个月的结果是混乱的
Result of getting next 12 months in Javascript is messed up
我有以下代码用于生成从今天开始的下一个 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;
}
}
相关文章:
- webpack代码拆分了handlerbs文件——结果是文件很大
- 试图将onChange函数作为道具传递给GrandChlidren,结果是TypeError:这是未定义的
- 为什么_self结果是不同的价值观
- 为什么结果是全局名称,这是由“这个”引起的
- 斐波那契数列的结果是无穷大,然后是 NaN
- 如何处理'00'JSON中的结果是JS或Coldfusion
- ReactJS-这个状态中的数组在删除时被正确更新,但结果是't,直到以后的状态发生变化
- 为什么这个JavaScript代码的结果是“;未定义”;
- 基准测试js的结果是什么意思
- 将函数从 obj 传递到数组中.然后添加数组,但结果是 NaN.为什么
- 在Javascript中获得下一个12个月的结果是混乱的
- 结果是检查多个复选框值并更新表数据
- 为什么Javascript给出的结果是数字而不是真/假的表达式
- 使用 Lodash 合并数组,为什么结果是重复的数组值?,我的代码在哪里出错
- 不同的结果是减去这两个值
- 通过循环更改 JSON 格式的数据.结果是三倍
- JavaScript检查一个对象数组的结果是错误的,而它应该是真的
- 使用Ajax的Phonegap发送图像的结果是[Object ArrayBuffer],而不是二进制
- 跳到主回调,结果是异步瀑布节点js
- 为什么下面的结果是“;必须设置Ember.set()才能访问此属性“”;