JavaScript中的今天日期减去30天

12

我需要获取今天往前30天的日期,格式为:"2016-06-08"

我已经尝试了setDate(date.getDate()-30);来获取-30天的日期。

我已经尝试了date.toISOString().split('T')[0]来获取日期的格式。

这两种方法都行,但是似乎不能同时使用。


3
你能演示一下这个问题吗? - Spencer Wieczorek
2
最好从当前时间戳中减去30天的毫秒数。 - adeneo
如果您提供了完整的代码,人们就可以看到它为什么不起作用,这样会更好。请参阅[mcve]。 - charlietfl
6个回答

38

setDate()方法不会返回一个Date对象,而是返回自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数。您需要分别进行调用:

var date = new Date();
date.setDate(date.getDate() - 30);
var dateString = date.toISOString().split('T')[0]; // "2016-06-08"

这种方法与从时间戳中减去30天的毫秒数相比如何? - vtange
@vtange 不太确定你的意思。我猜 OP 的代码是这样的:date.setDate(date.getDate() - 30).toISOString().split('T')[0],但这样是行不通的。 - user247702

4

您说这两行代码对您有用,而您的问题是如何将它们组合在一起。以下是如何实现:

var date = new Date();
date.setDate(date.getDate() - 30);
document.getElementById("result").innerHTML = date.toISOString().split('T')[0];
<div id="result"></div>

如果你真的想减去30天,那么这段代码是可以的,但如果你想减去一个月,显然这段代码不起作用,最好使用像moment.js这样的库,而不是试图自己实现。


4
请注意,最好使用类似moment.js这样的工具,而不是重复造轮子。然而,没有使用外部库的纯JS解决方案如下:
var date = new Date();
date.setDate(date.getDate() - 30); 

date设置为30天前。 (JS自动考虑闰年和滚动到小于30天的月份,并进入上一年)

现在,只需按照您想要的方式输出它(使您更多地控制输出)。 请注意,我们正在添加“0”,以便小于10的数字是以0为前缀的。

var dateString = date.getFullYear() + '-' + ("0" + (date.getMonth() + 1)).slice(-2) + '-' + ("0" + date.getDate()).slice(-2)

moment.js 确实是最佳选择。 - user247702
5
为什么要使用库来完成一些可以用几行代码可靠地完成的任务? - charlietfl
@charlietfl 除非事情已经改变,即使是现代浏览器在日期处理方面也存在微小的差异。 - user247702
3
使用一个完整的库(经过最小化和压缩后大约有 20,000 字节),去完成只需要 20 字节就可以完成的事情,对我来说似乎是疯狂的行为。 - adeneo
@charlietfl,同意。然而,我提到这一点是为了如果 OP 未来可能需要其他日期处理/格式化/转换样式,它就在他们的脑海中 :) - haxxxton
@Stijn 在任何这些答案中使用的任何东西上,跨浏览器都不会有任何区别。 - charlietfl

1

// Format date object into a YYYY-MM-DD string
const formatDate = (date) => (date.toISOString().split('T')[0]);

const currentDate = new Date();

// Values in milliseconds
const currentDateInMs = currentDate.valueOf();
const ThirtyDaysInMs = 1000 * 60 * 60 * 24 * 30;

const calculatedDate = new Date(currentDateInMs - ThirtyDaysInMs);

console.log(formatDate(currentDate));
console.log(formatDate(calculatedDate));


你的回答可以通过添加更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文献,以便其他人可以确认您的回答是否正确。您可以在帮助中心中找到有关如何编写好答案的更多信息。 - Community

0

你可以简单地用时间戳进行计算

var date = new Date(); // Current date
console.log(date.toDateString())
var pre_date = new Date(date.getTime() - 30*24*60*60*1000); 
// You will get the Date object 30 days earlier to current date.
console.log(pre_date.toDateString())

这里的30*24*60*60*1000指的是毫秒级别的时间差。


0

以 "YYYY-MM-DD" 格式表示的,今天日期减去30天:

var date = new Date();
date.setDate(date.getDate() - 30);
var dateString = date.toISOString().split('T')[0]; // "2021-02-05"

获取当前日期30天前的所有日期,格式为"年-月-日(YYYY-MM-DD)":

var daysDate = [];
for(var i = 1; i<= 30; i++) {
    var date = new Date();
    date.setDate(date.getDate() - i);
    daysDate.push(date.toISOString().split('T')[0]); // ["2021-02-05", "2021-02-04", ...]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接