Javascript 从日期开始减去/添加 1 个月

bog*_*gus 3 javascript date

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

我有这个代码:

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

此代码运行后 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=

谢谢。

Rob*_*obG 7

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
Run Code Online (Sandbox Code Playgroud)

这有副作用,因此连续减去 2 个月可能会得到与一次性减去 2 个月不同的结果。

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

聚苯乙烯

我回答这个问题之前,我记得有很多关于加月份的问题也涵盖了减法。因此,我将这个问题标记为重复,而不是删除这个答案,而是将其留给后代。

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