用JavaScript计算昨天的日期


Answers:


458
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)

12
真好 乍一看,getDate返回月份(例如:1-31)似乎会失败,但实际上setDate(0)将日期设置为上个月的最后一天。但是,这是否适用于所有浏览器?
Drew Noakes 2014年

1
无法验证“所有”浏览器,但可以在我测试过的所有camo.githubusercontent.com/中使用
James Kyburz 2014年

1
@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>日期.toISOString() '2018-02-09T16:26:30.821Z'
詹姆斯Kyburz

嗯,是的,只是直接对其进行了测试,您是对的,不确定我的用例有何不同,并因此完全脱离了它。所以我看不到。
Zargold

91

效率不是很高,但是作为一个班轮:

var yesterday = new Date(new Date().setDate(new Date().getDate()-1));

上面创建了三个Date不必要的对象。可以使用以下方法将其简化为单个实例:

var yesterday = (function(){this.setDate(this.getDate()-1); return this})
                  .call(new Date)

或者,如果您愿意:

var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)

或者,如果您更喜欢带有箭头功能的ES6:

let yesterday = ( d => new Date(d.setDate(d.getDate()-1)) )(new Date);

6
我希望避免弄乱范围:var yesterday = (function(d){ d.setDate(d.getDate()-1); return d})(new Date)
Roy Tinker

4
如果需要单线,请使用诸如new Date(Date.now()-24 * 60 * 60 * 1000)之类的东西;这样的好处是仅创建一个Date对象。但老实说,维护此代码的人比看到一些抛出函数的人(为此花费几毫秒)更高兴看到清晰的两行版本。
罗伯·惠兰2014年


60

出乎意料的是,最简单的跨浏览器解决方案没有答案

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

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

那就是如果你想摆脱依赖,否则我建议使用http://momentjs.com


7
夏时制更改时,这如何工作?那会不会在一个小时之前/一个小时之后撞到它?
亚当·特根

19

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

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);

这似乎是最安全的方法,因为我们正在以毫秒为单位的unix时代进行操作。因此,该算法比执行类似getDate()-1的方法更安全。我没有尝试过getDate()-1,但是根据getDate()的文档,如果今天的日期是任何月份的1号,它将返回1。1-1 = 0无效。不确定setDate(0)如何工作。
卡皮尔·彭塞2014年

1
这是我的方法,尽管您也可以简化它-尝试类似new Date(Date.now()-24 * 60 * 60 * 1000);
罗伯·惠兰2014年

setDate(0),顺便说一句-可以翻转到上个月的最后一天。但是,在我看来,在这里放弃毫秒表示法会比较整洁(并且更直观),一个缺点是“一天中的毫秒数”并不那么明显,因此很可能会错误地键入该计算结果。
罗伯·惠兰

使用Unix时间似乎是更可靠的选择。应该给它更高的评价。
Paul

是的,我最喜欢这种方法。含糊不清。我最终去了new Date(Date.parse(new Date()) - 86400000)。尽管我确实喜欢Date.now(),所以也许我会尝试使用它。这样可以节省额外的日期。
coblr

9

我使用矩型库,它非常灵活且易于使用。

在您的情况下:

let yesterday = moment().subtract(1, 'day').toDate();

2
您最好使用subtract代替add
托马斯·阿尤布

也可以!ng FullCalendar和他的validRange做得很好
XenoX


7
//Create a date object using the current time
var now = new Date();

//Subtract one day from it
now.setDate(now.getDate()-1);

6

var today = new Date();
var yesterday1 = new Date(new Date().setDate(new Date().getDate() - 1));
var yesterday2 = new Date(Date.now() - 86400000);
var yesterday3 = new Date(Date.now() - 1000*60*60*24);
var yesterday4 = new Date((new Date()).valueOf() - 1000*60*60*24);
console.log("Today: "+today);
console.log("Yesterday: "+yesterday1);
console.log("Yesterday: "+yesterday2);
console.log("Yesterday: "+yesterday3);
console.log("Yesterday: "+yesterday4);



2
d.setHours(0,0,0,0);

会成功的


1
会吗 我以为这只是将您的小时,分​​钟和秒设置为0,但实际上不更改日期吗?
杰斯珀·贝伦德

我必须使用负数才能到达昨天:d.setHours(-1,0,0,0)。这将返回昨天的日期,但可能不是您想要的时间(23:00:00)
cs_pupil

1

试试看,为我工作:

var today = new Date();
var yesterday = new Date(today.setDate(today.getDate() - 1)); `

这给了我昨天的约会对象


1
由于您使用的是today.setDate,因此今天也将更改为昨天。最好先创建昨天的变量,然后进行设置。 var yesterday = new Date(); yesterday.setDate(today.GetDate() - 1)所以您今天和昨天都可以使用
PersyJack

1

这是一个班轮,用于以文本YYYY-MM-DD的格式获取昨天的日期并处理时区偏移。

new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]

它可以明显地更改为返回日期,即x天。包括时间等

console.log(Date())
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('T')[0]); // "2019-11-11"
console.log(new Date(Date.now() - 1 * 86400000 - new Date().getTimezoneOffset() * 60000).toISOString().split('.')[0].replace('T',' ')); // "2019-11-11 11:11:11"

// that is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000    // this is: [dates] * 24 * 60 * 60 * 1000 - offsetinmin * 60 * 1000


0

如果您既要获取昨天的日期,又要以一种易于理解的格式设置该日期的格式,请考虑创建一个DateHelper看起来像这样的自定义对象:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Subtract 1 day
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -1));

(另请参阅此小提琴



0

解决边界日期问题(2020,01,01)-> 2019,12,31

var now = new Date();
return new Date(now.getMonth() - 1 === 0 ? now.getFullYear() - 1 : now.getFullYear(),
                now.getDate() - 1 === 0 ? now.getMonth() - 1: now.getMonth(),
                now.getDate() - 1);

-1

“ Date.now()-86400000”在夏令时结束的那一天(该日期为25小时)不起作用

另一种选择是使用闭包:

var d = new goog.date.Date();
d.add(new goog.date.Interval(0, 0, -1));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.