将date添加到JavaScriptdate

如何使用JavaScript将Date添加到当前Date 。 JavaScript是否有像.Net的AddDay这样的内置函数?

你可以创build一个:

 Date.prototype.addDays = function(days) { var dat = new Date(this.valueOf()); dat.setDate(dat.getDate() + days); return dat; } var dat = new Date(); alert(dat.addDays(5)) 

正确答案

 function addDays(date, days) { var result = new Date(date); result.setDate(result.getDate() + days); return result; } 

不正确的答案

这个答案有时会提供正确的结果,但往往会返回错误的年份和月份。 这个答案唯一的作用是当你添加date恰好有当前的年份和月份。

 // Don't do it this way! function addDaysWRONG(date, days) { var result = new Date(); result.setDate(date.getDate() + days); return result; } 

certificate/例子

检查这个JsFiddle

 // Correct function addDays(date, days) { var result = new Date(date); result.setDate(result.getDate() + days); return result; } // Bad Year/Month function addDaysWRONG(date, days) { var result = new Date(); result.setDate(date.getDate() + days); return result; } // Bad during DST function addDaysDstFail(date, days) { var dayms = (days * 24 * 60 * 60 * 1000); return new Date(date.getTime() + dayms); } // TEST function formatDate(date) { return (date.getMonth() + 1) + '/' + date.getDate() + '/' + date.getFullYear(); } $('tbody tr td:first-child').each(function () { var $in = $(this); var $out = $('<td/>').insertAfter($in).addClass("answer"); var $outFail = $('<td/>').insertAfter($out); var $outDstFail = $('<td/>').insertAfter($outFail); var date = new Date($in.text()); var correctDate = formatDate(addDays(date, 1)); var failDate = formatDate(addDaysWRONG(date, 1)); var failDstDate = formatDate(addDaysDstFail(date, 1)); $out.text(correctDate); $outFail.text(failDate); $outDstFail.text(failDstDate); $outFail.addClass(correctDate == failDate ? "right" : "wrong"); $outDstFail.addClass(correctDate == failDstDate ? "right" : "wrong"); }); 
 body { font-size: 14px; } table { border-collapse:collapse; } table, td, th { border:1px solid black; } td { padding: 2px; } .wrong { color: red; } .right { color: green; } .answer { font-weight: bold; } 
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <table> <tbody> <tr> <th colspan="4">DST Dates</th> </tr> <tr> <th>Input</th> <th>+1 Day</th> <th>+1 Day Fail</th> <th>+1 Day DST Fail</th> </tr> <tr><td>03/10/2013</td></tr> <tr><td>11/03/2013</td></tr> <tr><td>03/09/2014</td></tr> <tr><td>11/02/2014</td></tr> <tr><td>03/08/2015</td></tr> <tr><td>11/01/2015</td></tr> <tr> <th colspan="4">2013</th> </tr> <tr> <th>Input</th> <th>+1 Day</th> <th>+1 Day Fail</th> <th>+1 Day DST Fail</th> </tr> <tr><td>01/01/2013</td></tr> <tr><td>02/01/2013</td></tr> <tr><td>03/01/2013</td></tr> <tr><td>04/01/2013</td></tr> <tr><td>05/01/2013</td></tr> <tr><td>06/01/2013</td></tr> <tr><td>07/01/2013</td></tr> <tr><td>08/01/2013</td></tr> <tr><td>09/01/2013</td></tr> <tr><td>10/01/2013</td></tr> <tr><td>11/01/2013</td></tr> <tr><td>12/01/2013</td></tr> <tr> <th colspan="4">2014</th> </tr> <tr> <th>Input</th> <th>+1 Day</th> <th>+1 Day Fail</th> <th>+1 Day DST Fail</th> </tr> <tr><td>01/01/2014</td></tr> <tr><td>02/01/2014</td></tr> <tr><td>03/01/2014</td></tr> <tr><td>04/01/2014</td></tr> <tr><td>05/01/2014</td></tr> <tr><td>06/01/2014</td></tr> <tr><td>07/01/2014</td></tr> <tr><td>08/01/2014</td></tr> <tr><td>09/01/2014</td></tr> <tr><td>10/01/2014</td></tr> <tr><td>11/01/2014</td></tr> <tr><td>12/01/2014</td></tr> <tr> <th colspan="4">2015</th> </tr> <tr> <th>Input</th> <th>+1 Day</th> <th>+1 Day Fail</th> <th>+1 Day DST Fail</th> </tr> <tr><td>01/01/2015</td></tr> <tr><td>02/01/2015</td></tr> <tr><td>03/01/2015</td></tr> <tr><td>04/01/2015</td></tr> <tr><td>05/01/2015</td></tr> <tr><td>06/01/2015</td></tr> <tr><td>07/01/2015</td></tr> <tr><td>08/01/2015</td></tr> <tr><td>09/01/2015</td></tr> <tr><td>10/01/2015</td></tr> <tr><td>11/01/2015</td></tr> <tr><td>12/01/2015</td></tr> </tbody> </table> 
 var today = new Date(); var tomorrow = new Date(); tomorrow.setDate(today.getDate()+1); 

要小心,因为这可能会很棘手。 当设置“明天”时,它只能工作,因为它的当前值与“今天”的年份和月份相匹配。 但是,设置为“32”这样的date通常仍然可以正常工作,以便将其移至下个月。

我的解决scheme是:

 nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1); 

这个解决scheme没有夏令时的问题。 此外,还可以添加/删除任何年份,月份,date等的偏移量。

 day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61); 

是正确的代码。

这些答案似乎让我感到困惑,我更喜欢:

 var ms = new Date().getTime() + 86400000; var tomorrow = new Date(ms); 

自1970年以来,getTime()就是毫秒,而86400000是一天中的毫秒数。 因此,ms包含所需date的毫秒数。

使用毫秒构造函数给出所需的date对象。

尝试

 var someDate = new Date(); var duration = 2; //In Days someDate.setTime(someDate.getTime() + (duration * 24 * 60 * 60 * 1000)); 

使用setDate()添加date不会解决您的问题,尝试添加一些日子到2月份,如果你尝试添加新的日子,它不会导致你所期望的。

只是花了很长时间试图找出这一年的交易是什么,而不是在下面的例子中join。

如果你只是简单地添加n天到你最好只是去的date:

myDate.setDate(myDate.getDate()+ n);

或长期的版本

 var theDate = new Date(2013, 11, 15); var myNewDate = new Date(theDate); myNewDate.setDate(myNewDate.getDate() + 30); console.log(myNewDate); 

今天/明天的东西是混乱的。 通过将当前date设置为新的datevariables,您将弄乱年份值。 如果你从原来的date工作,你不会。

如果可以,请使用moment.js 。 JavaScript没有很好的本地date/时间方法。 以下是Moment的语法示例:

 var nextWeek = moment().add(7, 'days'); alert(nextWeek); 
 <script src="ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script> 

我昨晚创build了这些扩展:
你可以通过正面或负面的价值观;

例:

 var someDate = new Date(); var expirationDate = someDate.addDays(10); var previous = someDate.addDays(-5); Date.prototype.addDays = function (num) { var value = this.valueOf(); value += 86400000 * num; return new Date(value); } Date.prototype.addSeconds = function (num) { var value = this.valueOf(); value += 1000 * num; return new Date(value); } Date.prototype.addMinutes = function (num) { var value = this.valueOf(); value += 60000 * num; return new Date(value); } Date.prototype.addHours = function (num) { var value = this.valueOf(); value += 3600000 * num; return new Date(value); } Date.prototype.addMonths = function (num) { var value = new Date(this.valueOf()); var mo = this.getMonth(); var yr = this.getYear(); mo = (mo + num) % 12; if (0 > mo) { yr += (this.getMonth() + num - mo - 12) / 12; mo += 12; } else yr += ((this.getMonth() + num - mo) / 12); value.setMonth(mo); value.setYear(yr); return value; } 
 int days = 1; var newDate = new Date(Date.now() + days * 24*60*60*1000); 

CodePen

 var days = 2; var newDate = new Date(Date.now() + days * 24*60*60*1000); document.write('Today: <em>'); document.write(new Date()); document.write('</em><br/> New: <strong>'); document.write(newDate); 

最简单的解决scheme。

  Date.prototype.addDays = function(days) { this.setDate(this.getDate() + parseInt(days)); return this; }; // and then call var newDate = new Date().addDays(2); //+2 days console.log(newDate); // or var newDate1 = new Date().addDays(-2); //-2 days console.log(newDate1); 

感谢杰森的答案,如预期的那样,这是从你的代码和方便的格式AnthonyWJones的混合:

 Date.prototype.addDays = function(days){ var ms = new Date().getTime() + (86400000 * days); var added = new Date(ms); return added; } 

晚了, 但如果你使用jQuery那么有一个很好的插件叫做Moment:

http://momentjs.com/

 var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate(); 

http://momentjs.com/docs/#/manipulating/

还有很多其他好东西!

编辑:删除感谢aikeru的评论jQuery参考

老我知道,但有时我喜欢这样:

 function addDays(days) { return new Date(Date.now() + 864e5 * days); } 

setDate()的mozilla文档没有指出它将处理月末的情况。 请参阅https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

的setDate()

  • 根据当地时间设置指定date的月份(1-31)。

这就是为什么我需要添加天数时使用setTime()。

我使用类似于:

 new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000) 

与节省时间一起工作:

 new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000) 

与新的一年共事:

 new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000) 

它可以被参数化:

 function DateAdd(source, amount, step) { var factor = 1; if (step == "day") factor = 24 * 60 * 60 * 1000; else if (step == "hour") factor = 60 * 60 * 1000; ... new Date(source.getTime() + amount * factor); } 

我想我也会给出答案:
就个人而言,我喜欢试图避免无谓的variables声明,方法调用和构造函数调用,因为它们在性能上都很昂贵。 (当然,在合理的范围内)
我打算把这个留在@AnthonyWJones所给出的答案下,但是想得更好。

 // Prototype usage... Date.prototype.addDays = Date.prototype.addDays || function( days ) { return this.setTime( 864E5 * days + this.valueOf() ) && this; }; // Namespace usage... namespace.addDaysToDate = function( date, days ) { return date.setTime( 864E5 * days + date.valueOf() ) && date; }; // Basic Function declaration... function addDaysToDate( date, days ) { return date.setTime( 864E5 * days + date.valueOf() ) && date; }; 

以上将尊重DST。 这意味着如果您添加了多个与DST相交的天数,则显示的时间(小时)将会改变以反映这一点。
例:
2014年11月2日02:00是DST的结束。

 var dt = new Date( 2014, 10, 1, 10, 30, 0 ); console.log( dt ); // Sat Nov 01 2014 10:30:00 console.log( dt.addDays( 10 ) ); // Tue Nov 11 2014 09:30:00 

如果你想保留DST的时间(所以10:30还是10:30)…

 // Prototype usage... Date.prototype.addDays = Date.prototype.addDays || function( days ) { return this.setDate( this.getDate() + days ) && this; }; // Namespace usage... namespace.addDaysToDate = function( date, days ) { return date.setDate( date.getDate() + days ) && date; }; // Basic Function declaration... function addDaysToDate( date, days ) { return date.setDate( date.getDate() + days ) && date; }; 

所以,现在你有…

 var dt = new Date( 2014, 10, 1, 10, 30, 0 ); console.log( dt ); // Sat Nov 01 2014 10:30:00 console.log( dt.addDays( 10 ) ); // Tue Nov 11 2014 10:30:00 

我正在使用以下解决scheme。

 var msInDay = 86400000; var daysToAdd = 5; var now = new Date(); var milliseconds = now.getTime(); var newMillisecods = milliseconds + msInDay * daysToAdd; var newDate = new Date(newMillisecods); //or now.setTime(newMillisecods); 

Date有一个接受int的构造函数。 这个参数表示1970年1月1日之前/之后的总毫秒数。它还有一个setTime方法,它不会创build一个新的Date对象。

我们在这里做的是将天数转换为毫秒,并将此值添加到由getTime提供的值。 最后,我们给出Date(毫秒)构造函数或setTime(毫秒)方法的结果。

编辑:而不是setTime() (或setHours() )你可以这样做:

 Date.prototype.addDays= function(d){ this.setDate(this.getDate() + d); return this; }; var tomorrow = new Date().addDays(1); 

旧:

而不是使用setTime()你可以使用setHours()

 Date.prototype.addDays= function(d){ this.setHours(this.getHours() + d * 24); return this; }; var tomorrow = new Date().addDays(1); 

查看JSFiddle …

不,javascript没有内置函数,但是可以使用简单的代码行

 timeObject.setDate(timeObject.getDate() + countOfDays); 

我提出的解决scheme在夏令时方面存在问题。

通过使用getUTCDate / setUTCDate ,我解决了我的问题。

 // Curried, so that I can create helper functions like `add1Day` const addDays = num => date => { // Make a working copy so we don't mutate the supplied date. const d = new Date(date); d.setUTCDate(d.getUTCDate() + num); return d; } 

非常简单的代码在java脚本中添加date。

 var d = new Date(); d.setDate(d.getDate() + prompt('how many days you want to add write here')); alert(d); 

您可以在这里创build您的自定义帮助器function

 function plusToDate(currentDate, unit, howMuch) { var config = { second: 1000, // 1000 miliseconds minute: 60000, hour: 3600000, day: 86400000, week: 604800000, month: 2592000000, // Assuming 30 days in a month year: 31536000000 // Assuming 365 days in year }; var now = new Date(currentDate); return new Date(now + config[unit] * howMuch); } var today = new Date(); var theDayAfterTommorow = plusToDate(today, 'day', 2); 

顺便说一下,这是通用的解决scheme,无论您想要什么,都可以添加秒或分钟或天。

  //the_day is 2013-12-31 var the_day = Date.UTC(2013, 11, 31); // Now, the_day will be "1388448000000" in UTC+8; var the_next_day = new Date(the_day + 24 * 60 * 60 * 1000); // Now, the_next_day will be "Wed Jan 01 2014 08:00:00 GMT+0800" 

对于那些使用Angular的人:

做就是了:

 $scope.booking.totTijd.setMinutes($scope.booking.totTijd.getMinutes()+15); $scope.booking.totTijd.setDate($scope.booking.totTijd.getDate() + 1); 

许多这些答案要么需要一个大型图书馆,不要处理夏令时,或需要过于复杂的语法。 我写了一个轻量级组件 ,可以解决所有这些问题,并且可以在任何时间单位而不是仅仅几天的时间内工作。 希望这会帮助一些人仍然在看这些答案。 您可以简单地使用dateAdd()函数并传递一个date对象,一个值递增(+/-),单位递增。 你会得到一个更新的date对象。

例如,要添加5天:

 var originalDate = new Date('June 25, 2017 12:00:00'); var newDate = dateAdd(originalDate, 5, 'days'); // => June 30, 2017 12:00:00 

你也可以用秒,分,月,年等

此解决scheme在添加小时间单位(最多小时)时不会对夏令时做任何特殊处理,但在添加更大单位时需要考虑到这一点。 这意味着,增加5个小时的时间,将跨越夏令时似乎增加6/4小时,取决于春季/秋季。 但是,对于较大的时间单位,小时数将保持不变,只有日/月/年会更新。 这意味着在穿过DST边界时,增加24小时的行为与添加1天的行为不同。 这可以让你指定你喜欢的行为,因为有时候这两个结果都是有意义的(增加一天,增加一个完整的24小时)。

DST示例(EST):

 // Spring (time skips an hour at 2am) var dstDate = new Date('March 12, 2016 01:15:00'); var newDate1 = dateAdd(dstDate, 1, 'days'); // => March 13, 2016 1:15:00 var newDate2 = dateAdd(dstDate, 24, 'hours'); // => March 13, 2016 02:15:00 // Fall (time goes back an hour at 2am) var dstDate = new Date('November 5, 2016 01:15:00'); var newDate1 = dateAdd(dstDate, 1, 'days'); // => November 6, 2016 1:15:00 var newDate2 = dateAdd(dstDate, 24, 'hours'); // => November 7, 2016 00:15:00 

随意导入组件使用它!

 function addDays(n){ var t = new Date(); t.setDate(t.getDate() + n); var month = "0"+(t.getMonth()+1); var date = "0"+t.getDate(); month = month.slice(-2); date = date.slice(-2); var date = date +"/"+month +"/"+t.getFullYear(); alert(date); } addDays(5); 

我已经使用这种方法在一行中得到正确的date,以便按照上面的说法得到时间加上一天。

 ((new Date()).setDate((new Date()).getDate()+1)) 

我只是想我会build立一个正常的(new Date())

 (new Date()).getDate() > 21 

使用上面的代码,我现在可以在Date()中设置Date()中的所有内容,并且它的行为正常。

 (new Date(((new Date()).setDate((new Date()).getDate()+1)))).getDate() > 22 

或者获取Date对象:

 (new Date(((new Date()).setDate((new Date()).getDate()+1)))) 

我不敢相信5年后这个线程中没有任何切割的解决scheme
SO:无论夏季干扰如何,都能得到相同的时间:

 Date.prototype.addDays = function(days) { var dat = new Date( this.valueOf() ) var hour1 = dat.getHours() dat.setTime( dat.getTime() + days * 86400000) // 24*60*60*1000 = 24 hours var hour2 = dat.getHours() if (hour1 != hour2) // summertime occured +/- a WHOLE number of hours thank god! dat.setTime( dat.getTime() + (hour1 - hour2) * 3600000) // 60*60*1000 = 1 hour return dat or this.setTime( dat.getTime() ) // to modify the object directly } 

那里。 完成!

2.39KB缩小。 一个文件。 https://github.com/rhroyston/clock-js

 console.log(clock.what.weekday(clock.now + clock.unit.days)); //"wednesday" console.log(clock.what.weekday(clock.now + (clock.unit.days * 2))); //"thursday" console.log(clock.what.weekday(clock.now + (clock.unit.days * 3))); //"friday" 
 <script src="https://raw.githubusercontent.com/rhroyston/clock-js/master/clock.min.js"></script>