用 JavaScript 计算昨天的日期

IT技术 javascript date
2021-02-07 04:40:35

如何在 JavaScript 中将昨天计算为日期?

6个回答
var date = new Date();

date ; //# => Fri Apr 01 2011 11:14:50 GMT+0200 (CEST)

date.setDate(date.getDate() - 1);

date ; //# => Thu Mar 31 2011 11:14:50 GMT+0200 (CEST)
无法验证“所有”浏览器,但在我测试的所有浏览器中都有效camo.githubusercontent.com/...
2021-03-21 04:40:35
好的。乍一看,这似乎会失败,因为getDate返回月份中的日期(例如:1 - 31)但实际上setDate(0)将日期设置为上个月的最后一天。这是否适用于所有浏览器?
2021-04-01 04:40:35
嗯,是的,只是直接测试了它,你是对的,不确定我的用例有什么不同,并且已经完全重构了它。所以我将无法看到。
2021-04-06 04:40:35
@Zargold 不明白你的意思。node --version v9.4.0 node const date = new Date() undefined > date.toISOString() '2018-02-10T16:26:30.821Z' > date.setDate(date.getDate() - 1) 1518193590821 > date .toISOString() '2018-02-09T16:26:30.821Z'
2021-04-11 04:40:35

[编辑 2020 年 9 月]:包含先前答案的片段并添加了箭头功能

// a (not very efficient) oneliner
let yesterday = new Date(new Date().setDate(new Date().getDate()-1));
console.log(yesterday);

// a function call
yesterday = ( function(){this.setDate(this.getDate()-1); return this} )
            .call(new Date);
console.log(yesterday);

// an iife (immediately invoked function expression)
yesterday = function(d){ d.setDate(d.getDate()-1); return d}(new Date);
console.log(yesterday);

// oneliner using es6 arrow function
yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);
console.log(yesterday);

// use a method
const getYesterday = (dateOnly = false) => {
  let d = new Date();
  d.setDate(d.getDate() - 1);
  return dateOnly ? new Date(d.toDateString()) : d;
};
console.log(getYesterday());
console.log(getYesterday(true));

我宁愿避免弄乱范围: var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
2021-04-04 04:40:35
如果您需要单线,请使用类似 new Date( Date.now() - 24*60*60*1000 ); 这样做的好处是只创建一个 Date 对象。但说实话,谁保持真实这段代码将是高兴看到明确的2行版本比他们扔东西围绕功能(或毫秒,对于这个问题)。
2021-04-05 04:40:35
我真的很喜欢你这样做的方式。我已经有了我的解决方案,然后我看到了这个。我会改变我的昨天!我不得不稍微改变这个答案以添加括号以通过代码验证器:const yesterday = (d => new Date(d.setDate(d.getDate()-1)).toISOString().split("T")[0])(new Date());,我只是抓住 YYYY-MM-DD(无需填充以获取我只是用作设置日期输入的 max 属性的日期在这里使用 toISOString )。
2021-04-10 04:40:35

令人惊讶的是,最简单的跨浏览器解决方案没有答案

要查找与昨天完全相同的时间*:

var yesterday = new Date(Date.now() - 86400000); // that is: 24 * 60 * 60 * 1000

*:如果您的用例不介意日历奇怪的潜在不精确性(如夏令时),这很有效,否则我建议使用https://moment.github.io/luxon/

并且不要忘记闰秒。
2021-03-15 04:40:35
这不是正确答案,因为并非所有日子都持续 24 小时。在采用夏令时的国家(例如所有欧洲和大部分北美),一天持续 23 小时,一天持续 25 小时。
2021-04-06 04:40:35
当夏令时变化时,这如何工作?这不会提前/落后一小时吗?
2021-04-10 04:40:35

试试这个

var d = new Date();
d.setDate(d.getDate() - 1);
下一个命令 d.setHours(19,59); 将时间设置为晚上 7:59
2021-03-25 04:40:35

要概括问题并进行其他差异计算,请使用:

var yesterday = new Date((new Date()).valueOf() - 1000*60*60*24);

这将根据作为整数的“now”值创建一个新的日期对象,该整数表示以毫秒为单位的 unix 纪元减去一天。

前两天:

var twoDaysAgo = new Date((new Date()).valueOf() - 1000*60*60*24*2);

一小时前:

var oneHourAgo = new Date((new Date()).valueOf() - 1000*60*60);
@AmiHeines 在我看来,你永远不应该乘以 24。关于普通 Javascript,是的,date.setDate(date.getDate() + n)总是有效,无需寻找其他东西。您只需要确保这n是一个整数。当然,如果小时或分钟或秒存在差异,另一种方法是一种很好的方法。
2021-03-24 04:40:35
这似乎是最安全的方法,因为我们在以毫秒表示的 unix epoch 上运行。所以算术比做像 getDate()-1 这样的事情更安全。我没有尝试过 getDate()-1,但根据 getDate() 的文档,如果今天的日期是任何一个月的 1 号,它将返回 1。并且 1-1 = 0 不是有效日期。不确定 setDate(0) 将如何工作。
2021-04-01 04:40:35
这是我的方法,尽管您也可以稍微简化一下 - 尝试类似 new Date( Date.now() - 24*60*60*1000 );
2021-04-03 04:40:35
使用 unix time 似乎是更可靠的选择。这应该被评为更高。
2021-04-05 04:40:35
setDate(0),顺便说一句,没问题——它会翻转到上个月的最后一天。但对我来说,在这里放弃毫秒表示似乎更整洁(更直观)——一个缺点是“一天中的毫秒数”并不那么明显,所以很容易错误地输入该计算。
2021-04-06 04:40:35