如何将30分钟添加到JavaScript Date对象?

我想获得比另一个Date对象晚30分钟的Date对象。 我如何使用JavaScript?

使用库

如果你正在做大量的日期工作,你可能想看看像Datejs或Moment.js的 JavaScript日期库。 例如,用Moment.js,这很简单:

 var newDateObj = moment(oldDateObj).add(30, 'm').toDate(); 

香草的Javascript

这就像混沌的答案 ,但在一行中:

 var newDateObj = new Date(oldDateObj.getTime() + diff*60000); 

其中diff是从oldDateObj的时间你想要的差异。 甚至可能是消极的。

或者作为一个可重用的功能,如果你需要在多个地方做到这一点:

 function addMinutes(date, minutes) { return new Date(date.getTime() + minutes*60000); } 

小心香草的Javascript。 日期很难!

你可能会认为你可以添加24小时的日期来获取明天的日期,对吧? 错误!

 addMinutes(myDate, 60*24); //DO NOT DO THIS 

事实证明,如果用户观察夏令时,一天不一定是24小时。 一年只有一天,只有23小时,而一年有一天是25小时。 例如,在美国和加拿大的大部分地区,即2014年11月2日午夜24小时之后,仍然是11月2日:

 addMinutes(new Date('2014-11-02'), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3! 

这就是为什么使用上述图书馆之一是一个更安全的赌注,如果你必须做很多这样的工作。

下面是我写的这个函数的一个更通用的版本。 我仍然建议使用一个库,但是这可能是你的项目矫枉过正/不可能的。 该语法是在MySQL DATE_ADD函数之后建模的。

 /** * Adds time to a date. Modelled after MySQL DATE_ADD function. * Example: dateAdd(new Date(), 'minute', 30) //returns 30 minutes from now. * https://stackoverflow.com/a/1214753/18511 * * @param date Date to start with * @param interval One of: year, quarter, month, week, day, hour, minute, second * @param units Number of units of the given interval to add. */ function dateAdd(date, interval, units) { var ret = new Date(date); //don't change original date var checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);}; switch(interval.toLowerCase()) { case 'year' : ret.setFullYear(ret.getFullYear() + units); checkRollover(); break; case 'quarter': ret.setMonth(ret.getMonth() + 3*units); checkRollover(); break; case 'month' : ret.setMonth(ret.getMonth() + units); checkRollover(); break; case 'week' : ret.setDate(ret.getDate() + 7*units); break; case 'day' : ret.setDate(ret.getDate() + units); break; case 'hour' : ret.setTime(ret.getTime() + units*3600000); break; case 'minute' : ret.setTime(ret.getTime() + units*60000); break; case 'second' : ret.setTime(ret.getTime() + units*1000); break; default : ret = undefined; break; } return ret; } 

工作jsFiddle演示 。

 var d1 = new Date (), d2 = new Date ( d1 ); d2.setMinutes ( d1.getMinutes() + 30 ); alert ( d2 ); 
 var newDateObj = new Date(); newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000)); 
 var now = new Date(); now.setMinutes(now.getMinutes() + 30); 

也许这样?

 var d = new Date(); var v = new Date(); v.setMinutes(d.getMinutes()+30); 

我总是创建7个函数,在JS中使用日期:addSeconds,addMinutes,addHours,addDays,addWeeks,addMonths,addYears。

你可以在这里看到一个例子: http : //jsfiddle.net/tiagoajacobi/YHA8x/

如何使用:

 var now = new Date(); console.log(now.addMinutes(30)); console.log(now.addWeeks(3)); 

这是功能:

  Date.prototype.addSeconds = function(seconds) { this.setSeconds(this.getSeconds() + seconds); return this; }; Date.prototype.addMinutes = function(minutes) { this.setMinutes(this.getMinutes() + minutes); return this; }; Date.prototype.addHours = function(hours) { this.setHours(this.getHours() + hours); return this; }; Date.prototype.addDays = function(days) { this.setDate(this.getDate() + days); return this; }; Date.prototype.addWeeks = function(weeks) { this.addDays(weeks*7); return this; }; Date.prototype.addMonths = function (months) { var dt = this.getDate(); this.setMonth(this.getMonth() + months); var currDt = this.getDate(); if (dt !== currDt) { this.addDays(-currDt); } return this; }; Date.prototype.addYears = function(years) { var dt = this.getDate(); this.setFullYear(this.getFullYear() + years); var currDt = this.getDate(); if (dt !== currDt) { this.addDays(-currDt); } return this; }; 

这是我所做的,似乎工作得很好:

 Date.prototype.addMinutes = function(minutes) { var copiedDate = new Date(this.getTime()); return new Date(copiedDate.getTime() + minutes * 60000); } 

那么你可以这样调用它:

 var now = new Date(); console.log(now.addMinutes(50)); 

这里是ES6版本:

 let getTimeAfter30Mins = () => { let timeAfter30Mins = new Date(); timeAfter30Mins = new Date(timeAfter30Mins.setMinutes(timeAfter30Mins.getMinutes() + 30)); }; 

像这样称呼它:

 getTimeAfter30Mins(); 

只是另一个选择,我写道:

DP_DateExtensions库

如果这是你需要的所有日期处理,这是过度的,但它会做你想要的。

支持日期/时间格式,日期数学(加/减日期部分),日期比较,日期分析等。它是自由开源。

对于像我这样的懒惰:

基普的答案(从上面)在咖啡脚本,使用“枚举”,并在同一个对象上运行:

 Date.UNIT = YEAR: 0 QUARTER: 1 MONTH: 2 WEEK: 3 DAY: 4 HOUR: 5 MINUTE: 6 SECOND: 7 Date::add = (unit, quantity) -> switch unit when Date.UNIT.YEAR then @setFullYear(@getFullYear() + quantity) when Date.UNIT.QUARTER then @setMonth(@getMonth() + (3 * quantity)) when Date.UNIT.MONTH then @setMonth(@getMonth() + quantity) when Date.UNIT.WEEK then @setDate(@getDate() + (7 * quantity)) when Date.UNIT.DAY then @setDate(@getDate() + quantity) when Date.UNIT.HOUR then @setTime(@getTime() + (3600000 * quantity)) when Date.UNIT.MINUTE then @setTime(@getTime() + (60000 * quantity)) when Date.UNIT.SECOND then @setTime(@getTime() + (1000 * quantity)) else throw new Error "Unrecognized unit provided" @ # for chaining 

使用一个已知的库来处理涉及时间计算的怪癖。 我目前最喜欢的是moment.js 。

 <script src="ajax/libs/moment.js/2.13.0/moment.js"></script> <script> var now = moment(); // get "now" console.log(now.toDate()); // show original date var thirty = moment(now).add(30,"minutes"); // clone "now" object and add 30 minutes, taking into account weirdness like crossing DST boundries or leap-days, -minutes, -seconds. console.log(thirty.toDate()); // show new date </script> 

我觉得这里的很多答案都缺乏一个创造性的部分,非常需要时间旅行计算。 我提出我的解决方案为30分钟的时间翻译。

(jsfiddle 在这里 )

 function fluxCapacitor(n) { var delta,sigma=0,beta="ge"; (function(K,z){ (function(a,b,c){ beta=beta+"tT"; switch(b.shift()) { case'3':return z('0',a,c,b.shift(),1); case'0':return z('3',a,c,b.pop()); case'5':return z('2',a,c,b[0],1); case'1':return z('4',a,c,b.shift()); case'2':return z('5',a,c,b.pop()); case'4':return z('1',a,c,b.pop(),1); } })(K.pop(),K.pop().split(''),K.pop()); })(n.toString().split(':'),function(b,a,c,b1,gamma){ delta=[c,b+b1,a];sigma+=gamma?3600000:0; beta=beta+"im"; }); beta=beta+"e"; return new Date (sigma+(new Date( delta.join(':')))[beta]()); }