我正试图找到一种可靠地从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=
谢谢。
答案 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?
在回答这个问题之前,我想起了很多关于加数也包括减法的问题。因此,我将此问题标记为重复,而不是删除此答案,而是留给后代。
如果您想对答案进行投票,请转到重复项之一,然后在此处对答案进行投票。 :-)
答案 1 :(得分:1)
根据我自己的经验,我可能认为javascript中Date
的所有计算完全是无法忍受的痛苦。
对于任何Date操作,尽可能避免自己的精心设计的功能。有太多的特征根本无法失去理智。时区,错误的时钟,您自己的主机上的时区与服务器上的时区,根据本地主机时区/时钟的意外toString转换。
如果您需要集会一些日期,请使用经过测试的库,例如date-fns,moment.js等。
通过您的示例几乎正确的方式,您只是选择了不适合的时间来对其进行测试。我认为有问题的唯一方法是使用setMonth
来变异原始shippedDate
。