2015-12-01减去1个月至2015-12-31

时间:2016-04-05 13:35:43

标签: javascript date subtraction

我正在尝试从2015-12-31减去一个月,但它会给我2015-12-01而不是2015-11-30。为什么?

代码:

var date1 = new Date('2015-12-31');
var date2 = new Date(date1);

date2.setMonth(date1.getMonth() - 1);
console.log(date1);
console.log(date2);

输出:

Thu Dec 31 2015 01:00:00 GMT+0100 (CET)
Tue Dec 01 2015 01:00:00 GMT+0100 (CET)

任何解决方法?

4 个答案:

答案 0 :(得分:1)

减去月数时,您可以检查调整后日期的日期是否与初始日期的日期不同。如果是,那么它必须已经滚动到下个月,所以将调整后的日期的日期设置为0,因此它会转到上个月的最后一天,例如。

function subtractMonths(date, months) {
  var day = date.getDate();
  date.setMonth(date.getMonth() - months);
  if (date.getDate() != day) date.setDate(0);
  return date;
}

// 31 Mar 2016 - 1 month = 29 Feb 2015
[[new Date(2016,2,31), 1],

 // 29 Feb 2016 - 12 months = 28 Feb 2015
 [new Date(2016,1,29), 12],

 // 15 Feb 2016 - 3 months = 15 Nov 2015
 [new Date(2016,1,15), 3]].forEach(function(arr){
  document.write('<br>' + subtractMonths(arr[0], arr[1]));
})

可以使用相同的算法来添加月份。注意,这就是日期算术不对称的原因,例如,

31 May + 1 month  => 30 June
30 June - 1 month => 30 May

即。如果A + B = C,那么C - B = A可能是也可能不是(反之亦然)。

答案 1 :(得分:0)

根据setMonth documentation,'如果未指定[optional] dayValue参数,则使用getDate()方法返回的值'。由于您未指定可选参数,因此您的代码会尝试将日期设置为2015-11-31,这是无效的。 JavaScript通过将日期设置为2015-11-30之后的某一天(即2015-12-01)来解决此问题。

至于解决方法,它取决于你实际上要做什么。你想从12月31日开始回归31天吗?或者你想要在12月之前的最后一天?日期语义极其复杂;当不可避免的边缘情况出现时,你打算做什么?

答案 2 :(得分:0)

正在生成请求的结果,该结果从给定的日期减去1个月。但请记住,一个月是一个可变的时间。 11月31日实际上是12月1日(就像11月55日实际上是12月25日,圣诞节)。要获得上个月的最后一天,您可以执行以下操作:

var date = new Date('2015-12-31');
date.setDate(-1)

答案 3 :(得分:0)

试试这个

var date1 = new Date('2015-12-31');
var date2 = new Date(date1);
date2.setDate(date2.getDate()-date1.getDate()); 
alert(date2)