在JavaScript中减去日期的天数

有谁知道一个简单的方法来取一个日期(如今天)和回X日?

所以,例如,如果我想要在今天5天之前计算日期。

尝试这样的事情:

  var d = new Date(); d.setDate(d.getDate()-5); 

请注意,这会修改日期对象并返回更新日期的时间值。

 var d = new Date(); document.write('Today is: ' + d.toLocaleString()); d.setDate(d.getDate() - 5); document.write('<br>5 days ago was: ' + d.toLocaleString()); 
 var dateOffset = (24*60*60*1000) * 5; //5 days var myDate = new Date(); myDate.setTime(myDate.getTime() - dateOffset); 

如果您在整个Web应用程序中执行很多令人头痛的日期操作, DateJS将使您的生活变得更加轻松:

http://simonwillison.net/2007/Dec/3/datejs/

它是这样的:

 var d = new Date(); // today! var x = 5; // go back 5 days! d.setDate(d.getDate() - x); 

我注意到,getDays + X在日/月边界上不起作用。 只要您的日期不在1970年以前,使用getTime就可以工作。

 var todayDate = new Date(), weekDate = new Date(); weekDate.setTime(todayDate.getTime()-(7*24*3600000)); 

我为Date创建了这个原型,这样我就可以通过负值来减去天数和正值来增加天数。

 if(!Date.prototype.adjustDate){ Date.prototype.adjustDate = function(days){ var date; days = days || 0; if(days === 0){ date = new Date( this.getTime() ); } else if(days > 0) { date = new Date( this.getTime() ); date.setDate(date.getDate() + days); } else { date = new Date( this.getFullYear(), this.getMonth(), this.getDate() - Math.abs(days), this.getHours(), this.getMinutes(), this.getSeconds(), this.getMilliseconds() ); } this.setTime(date.getTime()); return this; }; } 

所以,使用它我可以简单地写:

 var date_subtract = new Date().adjustDate(-4), date_add = new Date().adjustDate(4); 

将日期分成几部分,然后用调整后的值返回一个新的日期

 function DateAdd(date, type, amount){ var y = date.getFullYear(), m = date.getMonth(), d = date.getDate(); if(type === 'y'){ y += amount; }; if(type === 'm'){ m += amount; }; if(type === 'd'){ d += amount; }; return new Date(y, m, d); } 

请记住,这几个月是零基础,但时间不是。 即新日期(2009,1,1)== 2009年2月1日,新日期(2009,1,0)== 2009年1月31日;

我喜欢在毫秒内做数学。 所以使用Date.now()

 var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds 

如果你喜欢它的格式

 new Date(newDate).toString(); // or .toUTCString or .toISOString ... 

注意: Date.now()在旧版浏览器中不起作用(例如IE8我认为)。 在这里填充 。

更新2015年6月

@Socketpair指出了我的sl </s>。 正如他/她所说:“每天有23个小时,有25个是由于时区规定的”。

为了扩大这一点,上面的答案将有日光不准确的情况下,如果你想计算5天前的本地日在一个日光节约变化的时区和你

  • 假设(错误地) Date.now()给你当前LOCAL现在的时间,或者
  • 使用.toString()返回本地日期,因此与UTC中的Date.now()基准日期不兼容。

但是,如果你用UTC来计算你的数学,那么它是有效的

答:您希望从NOW(UTC)5天前发出UTC日期

 var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString 

B.您使用Date.UTC()之外的UTC基准日期而不是“now”

 newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000; new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString 

得到moment.js。 所有的酷小孩都用它。 它有更多的格式选项,等等

 var n = 5; var dateMnsFive = moment(<your date>).subtract(n , 'day'); 

可选的! 转换为JS Date对象的角度绑定。

 var date = new Date(dateMnsFive.toISOString()); 

可选的! 格式

 var date = dateMnsFive.format("YYYY-MM-DD"); 

一些现有的解决方案是接近的,但不完全是我想要的。 此函数与正值或负值一起使用,并处理边界情况。

 function addDays(date, days) { return new Date( date.getFullYear(), date.getMonth(), date.getDate() + days, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds() ); } 

最重要的答案导致了我的代码中的错误,在本月的第一个月,它将在当月设置未来的日期。 这是我做的,

 curDate = new Date(); // Took current date as an example prvDate = new Date(0); // Date set to epoch 0 prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time 

管理日期的简单方法是使用Moment.js

您可以使用add 。 例

 var startdate = "20.03.2014"; var new_date = moment(startdate, "DD.MM.YYYY"); new_date.add(5, 'days'); //Add 5 days to start date alert(new_date); 

Google文档http://momentjs.com/docs/#/manipulating/add/

 var d = new Date(); document.write('Today is: ' + d.toLocaleString()); d.setDate(d.getDate() - 31); document.write('<br>5 days ago was: ' + d.toLocaleString()); 

我发现getDate()/ setDate()方法的一个问题是,它很容易把所有的东西都变成毫秒,语法有时难以跟上。

相反,我喜欢解决这个事实,即1天= 86,400,000毫秒。

所以,对于你的特定问题:

 today = new Date() days = 86400000 //number of milliseconds in a day fiveDaysAgo = new Date(today - (5*days)) 

奇迹般有效。

我一直使用这种方法来进行30/60/365天的计算。

你可以很容易地推断这个创建几个月,几年的时间单位

对于我来说,所有的组合都可以在下面的代码snipplet中正常工作,这个片段是用于Angular-2的实现,如果你需要添加日子,通过正数的日子,如果你需要减去通过负数的日子

 function addSubstractDays(date: Date, numberofDays: number): Date { let d = new Date(date); return new Date( d.getFullYear(), d.getMonth(), (d.getDate() + numberofDays) ); 

设置日期时,日期转换为毫秒,所以您需要将其转换回日期:

这个方法也考虑到了,新年的变化等等。

 function addDays( date, days ) { var dateInMs = date.setDate(date.getDate() - days); return new Date(dateInMs); } var date_from = new Date(); var date_to = addDays( new Date(), parseInt(days) ); 

你可以使用Javascript。

 var CurrDate = new Date(); // Current Date var numberOfDays = 5; var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays); alert(days); // It will print 5 days before today 

对于PHP,

 $date = date('Ym-d', strtotime("-5 days")); // it shows 5 days before today. echo $date; 

希望它会帮助你。

我喜欢以下,因为它是一条线。 DST变化并不完美,但通常足够满足我的需求。

 var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5)); 
 function addDays (date, daysToAdd) { var _24HoursInMilliseconds = 86400000; return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds); }; var now = new Date(); var yesterday = addDays(now, - 1); var tomorrow = addDays(now, 1); 
 var d = new Date(); document.write('Today is: ' + d.toLocaleString()); d.setDate(d.getDate() - 100); document.write('<br>100 days ago was: ' + d.toLocaleString()); 
 var daysToSubtract = 3; $.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ; 
 var my date = new Date().toISOString().substring(0, 10); 

它可以给你只有像2014-06-20的日期。 希望会有所帮助