首页 > 解决方案 > Javascript从日期减/加1个月

问题描述

我正在尝试找到一种可靠地从 javascript 日期对象中减去 1 个月的方法。

我有这个代码:

    var shippedDate = new Date('12/31/2020');
    var tempDate = new Date(shippedDate.setMonth(shippedDate.getMonth() - 1)); //subtract 1 month
    alert(tempDate);

这段代码运行后 tempDate 中的值12/1/2020实际上应该是11/30/2020.

我用这个在线日期计算器检查了我的数学:https ://www.timeanddate.com/date/dateadded.html?m1=12&d1=31&y1=2020&type=sub&ay=&am=1&aw=&ad=&rec=

谢谢。

标签: javascriptdate

解决方案


12 月有 31 天,所以当你减去 1 个月时,你会得到不存在的 11 月 31 日,所以它会滚动到 12 月 1 日。

您可以测试日期(月中的一天)以查看它是否相同,如果不是,请将日期设置为 0,以便它转到上个月的最后一天。

此外,setDate修改了 Date 对象,因此无需创建新对象:

function subtractMonth(date, months) {
  let d = date.getDate();
  date.setMonth(date.getMonth() - months);
  if (date.getDate() != d) {
    date.setDate(0);
  }
  return date;
}

let d = new Date(2020, 11, 31); // 31 Dec 2020
console.log(subtractMonth(d, 1).toString()); // 30 Nov 2020

这有副作用,因此顺序减去 2 个月可能会产生与一次性减去 2 个月不同的结果。

另外关于new Date('12/31/2020'),请参阅为什么 Date.parse 给出不正确的结果?

附言

在我记得有很多关于添加月份的问题之前,我回答了这个问题,也包括减法。所以我把这个问题标记为重复,而不是删除这个答案,留给后代。

如果您想投票给一个答案,请转到其中一个副本并在那里投票给一个答案。:-)


推荐阅读