javascript - 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=
谢谢。
解决方案
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 给出不正确的结果?
附言
在我记得有很多关于添加月份的问题之前,我回答了这个问题,也包括减法。所以我把这个问题标记为重复,而不是删除这个答案,留给后代。
如果您想投票给一个答案,请转到其中一个副本并在那里投票给一个答案。:-)
推荐阅读
- javascript - 如果日期更多是页面加载时定义的日期,如何添加类
- android - 无法在最新的 android studio 中解决依赖问题。为什么以及最新的android studio中的问题是什么
- api - 在 softlayer 上配置网络网关时无法过滤具有服务器的数据中心
- mysql - MySQL触发器在插入另一个表后更新一个表中的字段
- python - 创建一个包含不同行的项目的列表
- delphi - FireDAC ResultConnectionDef 和有关服务器和端口的信息
- c# - 如何为在公式中包含文本框的公式计算的复选框分配值
- wpf - wpf datagrid DataGridTemplateColumn.CellTemplate TextBox HorizontalAlignment
- excel - Power Pivot 数据源 URL 存储在 Excel 文件的内部 XML 中的什么位置?
- sql - java.sql.SQLSyntaxErrorException: ORA-00933: SQL 命令未以 WHERE 子句正确结束