我有这段代码:
var nextDate = new Date("2016 01 31");
nextDate.setMonth(nextDate.getMonth() + 1);
我希望结果为Feb 28 2016
,但它会显示Mar 02 2016
。
为什么呢?它有什么解决方案吗?
答案 0 :(得分:0)
这是因为二月有29天,当您从一月份(即31天)到二月份设置新月份时,天数的差异将转移到另一个月。 简单的方法就是创建新的Date实例。
您可能需要实现一些逻辑来正确获取相应的日期
答案 1 :(得分:0)
2月只有29天,因此2月31日将转化为2号火星。
您需要将日期对象中的日期更新为该月的最后一天。您可以通过指定将日期设置为0的函数来获取该月的最后一天:
function daysInMonth(month,year) {
return new Date(year, month, 0).getDate();
}

答案 2 :(得分:0)
使用辅助函数可能的解决方法:在setMonth
之后,检查结果是否包含与预期月份相等的月份,如果是,请使用setDate(0)
,将日期设置为最后上个月的一天。例如
Date.prototype.addMonths = function(months){
var m = this.getMonth() + (months || 1);
this.setMonth(m);
if(this.getMonth() !== (m % 11)) //11: month is 0 based
this.setDate(0);
}
var nextDate = new Date("2016 01 31");
nextDate.addMonths(1);
document.writeln(nextDate);
months || 1
仅在没有提交月份时才有默认值。在年度转换的情况下需要m % 11
。 11而不是12因为javascripts月(因此getMonth
)基于0。