【问题标题】:Javascript Subtract/Add 1 month from date [duplicate]Javascript从日期减去/添加1个月[重复]
【发布时间】:2020-05-04 20:04:55
【问题描述】:

我正在尝试找到一种可靠地从 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=

谢谢。

【问题讨论】:

  • 月份索引在 JavaScript 日期中从零开始。
  • 代码正确,值在技术上是正确的。由于是凌晨 12 点,所以日期显示为 12 月 1 日。
  • @user120242 那么解决办法是从 shippingDate 中减去 1 分钟吗?
  • 不,看看 RobG 的回答。他明白了

标签: javascript date


【解决方案1】:

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'),见Why does Date.parse give incorrect results?

PS

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

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

【讨论】:

  • 代码不正确。月参数没有被使用。
  • 您发布的函数subtractMonth(date, months) 将日期和月份作为参数。使用日期,但忽略月份参数。
  • @bogus——啊,谢谢!
【解决方案2】:

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

尽可能避免对任何日期操作使用自己制作的函数。有太多的特质根本无法忘怀。时区、错误的时钟、您自己主机上的时区与服务器上的时区、根据本地主机时区/时钟的意外 toString 转换。

如果您需要进行一些日期计算,请使用久经考验的库,例如 date-fns、moment.js 等。

顺便说一句,您的示例几乎是正确的,您只是选择了不合适的时间来尝试测试它。唯一我认为有问题的是使用setMonth 来改变原始shippedDate

【讨论】:

  • 这应该是评论,不是答案。
猜你喜欢
  • 2014-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2016-12-08
  • 2018-07-27
相关资源
最近更新 更多