Javascript减去/添加日期起1个月

时间:2020-05-04 20:04:55

标签: 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);

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

谢谢。

2 个答案:

答案 0 :(得分:3)

12月有31天,所以当减去1个月时,您会得到11月31日的日期,因此11月31日不存在。

您可以测试日期(月中的天)是否相同,如果不相同,则将日期设置为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'),请参见Why does Date.parse give incorrect results?

PS

在回答这个问题之前,我想起了很多关于加数也包括减法的问题。因此,我将此问题标记为重复,而不是删除此答案,而是留给后代。

如果您想对答案进行投票,请转到重复项之一,然后在此处对答案进行投票。 :-)

答案 1 :(得分:1)

根据我自己的经验,我可能认为javascript中Date的所有计算完全是无法忍受的痛苦。

对于任何Date操作,尽可能避免自己的精心设计的功能。有太多的特征根本无法失去理智。时区,错误的时钟,您自己的主机上的时区与服务器上的时区,根据本地主机时区/时钟的意外toString转换。

如果您需要集会一些日期,请使用经过测试的库,例如date-fns,moment.js等。

通过您的示例几乎正确的方式,您只是选择了不适合的时间来对其进行测试。我认为有问题的唯一方法是使用setMonth来变异原始shippedDate