为什么这个日期时间功能setMonth结果是错误的? getMonth()+ 1

时间:2016-03-14 09:32:06

标签: javascript date datetime object date-formatting

我有这段代码:

var nextDate  = new Date("2016 01 31");
nextDate.setMonth(nextDate.getMonth() + 1);

我希望结果为Feb 28 2016,但它会显示Mar 02 2016

为什么呢?它有什么解决方案吗?

3 个答案:

答案 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。