如何在今天之前的三个月用 JavaScript 计算日期?

2022-08-30 01:16:20

我正在尝试形成一个比当前日期早3个月的日期。我通过下面的代码获得当前月份

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

你们能否为我提供计算和形成日期(数据类型的对象)的逻辑,因为当月份为1月(1),日期前3个月将是OCtober(10)?Date


答案 1
var d = new Date();
d.setMonth(d.getMonth() - 3);

这适用于一月份。运行此代码段:

var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());

有一些警告...

一个月是一件奇怪的事情。您如何定义 1 个月?30天?大多数人会说,一个月前意味着上个月的同一天需要引用。但超过一半的时间,那是31天前,而不是30天前。如果今天是该月的 31 日(它不是 8 月或 12 月),则该月的那一天在上个月不存在。

有趣的是,如果你问它哪一天比另一天早一个月,谷歌同意JavaScript:

Google search result for 'one month before March 31st' shows 'March 3rd'

它还说一个月是30.4167天Google search result for 'one month in days' shows '30.4167'

那么,3月31日之前的一个月是否与3月28日之前的一个月相同,提前了3天?这一切都取决于你所说的“一个月前”是什么意思。去和你的产品负责人对话吧。

如果你想像 momentjs 那样做,并通过移动到当月的最后一天来纠正这些月份的最后一天错误,你可以做这样的事情:

const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
    d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());

如果你的要求比这更复杂,请使用一些数学运算并编写一些代码。您是开发人员!您不必安装库!您不必从堆栈溢出中复制和粘贴!您可以自己开发代码,以精确地完成您需要的操作!


答案 2

我建议使用一个名为Moment.js的库。

它经过了充分的测试,可以在浏览器和服务器端工作(我在Angular和Node项目中都使用它)。它对区域设置日期有很好的支持。

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format()返回以 ISO 8601 格式设置的日期的字符串表示形式。您也可以将其与自定义日期格式一起使用,如下所示:.format('dddd, MMMM Do YYYY, h:mm:ss a')