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

我想获取一个比另一个Date对象晚30分钟的Date对象。如何使用JavaScript执行此操作?

1019130 次浏览

var oldDateObj = new Date();var newDateObj = new Date();newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));console.log(newDateObj);

也许像这样?

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

var d1 = new Date (),d2 = new Date ( d1 );d2.setMinutes ( d1.getMinutes() + 30 );alert ( d2 );

使用图书馆

如果您正在进行大量的日期工作,您可能需要查看JavaScript日期库,例如datejsMoment.js。例如,对于Moment.js,这很简单:

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

Vanilla Javascript

这类似于混沌的答案,但在一行中:

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

其中diff是您希望与oldDateObj的时间相差的分钟数。它甚至可以是负数。

或者作为一个可重用的函数,如果你需要在多个地方执行此操作:

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

以防万一这一点不明显,我们将分钟乘以60000的原因是将分钟转换为毫秒。

小心使用Vanilla Javascript。日期很难!

你可能认为你可以在一个日期上加上24小时来得到明天的日期,对吗?

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

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

const NOV = 10; //because JS months are off by one...addMinutes(new Date(2014, NOV, 2), 60*24); //In USA, prints 11pm on Nov 2, not 12am Nov 3!

这就是为什么使用上述库中的一个是更安全的选择如果你必须用它做很多工作。

下面是我编写的此函数的更通用版本。我仍然建议使用库,但这对您的项目来说可能是多余的/不可能的。语法以MySQLDATE_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) {if(!(date instanceof Date))return undefined;var ret = new Date(date); //don't change original datevar checkRollover = function() { if(ret.getDate() != date.getDate()) ret.setDate(0);};switch(String(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演示

另一个选择,我写的:

DP_DateExtensions库

如果这是您需要的所有日期处理,那就太过分了,但它会做您想要的事情。

支持日期/时间格式,日期数学(添加/减去日期部分),日期比较,日期解析等。

var now = new Date();now.setMinutes(now.getMinutes() + 30); // timestampnow = new Date(now); // Date objectconsole.log(now);

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

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

我总是创建7个函数,在JS中使用date:
addSecondsaddMinutesaddHoursaddDaysaddWeeksaddMonthsaddYears.

你可以在这里看到一个例子: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;};

对于像我这样懒惰的人:

Kip在coffeescript中的答案(来自上面),使用“enum”,并对同一个对象进行操作:

Date.UNIT =YEAR: 0QUARTER: 1MONTH: 2WEEK: 3DAY: 4HOUR: 5MINUTE: 6SECOND: 7Date::add = (unit, quantity) ->switch unitwhen 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="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js"></script><script>var now = moment(); // get "now"console.log(now.toDate()); // show original datevar 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>

以下是ES6版本:

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

称之为:

getTimeAfter30Mins();

我觉得这里的许多答案都缺乏时间旅行计算所需的创造性组件。我提出了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]());}

最简单的解决方法是认识到javascript中的日期只是数字。它从0'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)开始。每个1代表一毫秒。您可以通过获取值并使用该值实例化新日期来添加或减去毫秒。您可以很容易地管理它。

const minutesToAdjust = 10;const millisecondsPerMinute = 60000;const originalDate = new Date('11/20/2017 10:00 AM');const modifiedDate1 = new Date(originalDate.valueOf() - (minutesToAdjust * millisecondsPerMinute));const modifiedDate2 = new Date(originalDate.valueOf() + (minutesToAdjust * millisecondsPerMinute));
console.log(originalDate); // Mon Nov 20 2017 10:00:00 GMT-0600 (CST)console.log(modifiedDate1); // Mon Nov 20 2017 09:50:00 GMT-0600 (CST)console.log(modifiedDate2); // Mon Nov 20 2017 10:10:00 GMT-0600 (CST)

你可以这样做:

let thirtyMinutes = 30 * 60 * 1000; // convert 30 minutes to millisecondslet date1 = new Date();let date2 = new Date(date1.getTime() + thirtyMinutes);console.log(date1);console.log(date2);

以下是我的单行:

console.log('time: ', new Date(new Date().valueOf() + 60000))

我知道这个主题太老了。但我很确定有些开发人员仍然需要这个,所以我为你制作了这个简单的脚本。希望你喜欢!

你好,现在是2020年,我已经添加了一些修改,希望它现在能帮助更好!

又见面了,现在是2022年,我再次回来解决一些问题,并为方法和函数提供更好的命名。

function addTimeToDate(addedTime, date){let generatedTime = date.getTime();if(addedTime.seconds) generatedTime += 1000 * addedTime.seconds; //check for additional secondsif(addedTime.minutes) generatedTime += 1000* 60 * addedTime.minutes;//check for additional minutesif(addedTime.hours) generatedTime += 1000 * 60 * 60 * addedTime.hours;//check for additional hoursreturn new Date(generatedTime);}
Date.prototype.addTime = function(addedTime){return addTimeToDate(addedTime, this);}
let futureDate = new Date().addTime({hours: 16, //Adding one hourminutes: 45, //Adding fourty five minutesseconds: 0 //Adding 0 seconds return to not adding any second so  we can remove it.});
<button onclick="console.log(futureDate)">Travel to the future</button>

你应该获取当前日期的值来获取带有(ms)的日期并将(30*60*1000)添加到它。现在你有(当前日期+30分钟)带有ms

console.log('with ms', Date.now() + (30 * 60 * 1000))console.log('new Date', new Date(Date.now() + (30 * 60 * 1000)))

以下是IsoString版本:

console.log(new Date(new Date().setMinutes(new Date().getMinutes() - (30))).toISOString());

其他解决方案:

var dateAv = new Date();var endTime = new Date(dateAv.getFullYear(), dateAv.getMonth(), dateAv.getDate(), dateAv.getHours(), dateAv.getMinutes() + 30);          

这很简单,因为它是;

let initial_date = new Date;let added30Min = new Date(initial_date.getTime() + (30*60*1000));

停止使用Moment.js

正如其他优秀答案所建议的那样,在大多数情况下,处理日期时最好使用库。然而,重要的是要知道,截至2020年9月Moment.js被认为是遗产,不应再在新项目中使用。

引用Moment在其官方文档中的声明:

我们希望阻止Moment在未来的新项目中使用。[…]我们现在通常认为Moment是维护模式下的遗留项目。它不是,但它确实是完成

现代图书馆

以下是Moment推荐的替代方案。

卢克松

Luxon可以被认为是Moment的演变。它由艾萨克·坎布伦撰写,他是Moment的长期贡献者。请阅读Luxon留档中的卢克松为什么存在?对于时刻用户页。

  • 区域设置:提供Intl
  • 时区:提供Intl
import {DateTime} from 'luxon'
function addMinutes(date, minutes) {return DateTime.fromJSDate(date).plus({minutes}).toJSDate()}

Day.js

Day.js旨在使用类似的API来替代Moment.js。它不是一个直接的替代品,但如果您习惯于使用Moment的API并希望快速行动,请考虑使用Day.js.

  • 区域设置:可以单独导入的自定义数据文件
  • 时区:通过插件提供Intl
import dayjs from 'dayjs'
function addMinutes(date, minutes) {return dayjs(date).add(minutes, 'minutes').toDate()}

date-fns

date-fns提供了一系列用于操作JavaScript#0对象的函数。有关更多详细信息,请滚动到“为什么是date-fns?”在date-fns主页上。

  • 区域设置:可以单独导入的自定义数据文件
  • 时区:通过单独的配套库提供Intl
import {addMinutes} from 'date-fns'
function addMinutesDemo(date, minutes) {return addMinutes(date, minutes)}

js-Joda

JS-Joda是Java3-10后门的JavaScript移植,它是JSR-310实现JavaSE 8java.time包的基础。如果您熟悉#0Joda-Time野田时间,您会发现js-Joda具有可比性。

  • 区域设置:通过附加模块自定义数据文件
  • 时区:通过附加模块自定义数据文件
import {LocalDateTime, nativeJs, convert} from '@js-joda/core'
function addMinutes(date, minutes) {return convert(LocalDateTime.from(nativeJs(date)).plusMinutes(minutes)).toDate()}

简单地说,您可以将此代码与momnet库一起使用:

console.log(moment(moment()).add(30,"minutes").format('MM/DD/YYYY hh:mm:ss'));
var myDate= new Date();var MyNewDate = new Date(myDate.getFullYear(),myDate.getMonth(),myDate.getDate(),myDate.getMinutes()+10,01,01)
var add_minutes =  function (dt, minutes) {return new Date(dt.getTime() + minutes*60000);}console.log(add_minutes(new Date(2014,10,2), 30).toString());

一行代码

  var afterSomeMinutes = new Date(new Date().getTime() + minutes * 60000);

其中minutes是一个数字

“添加”30分钟的一种方法是创建第二个日期对象(主要用于演示)和设置会议记录minutes + 30。如果第一次距离下一个小时不到30分钟,这也将考虑调整小时。(即4:455:15

const first = new Date();console.log("first date :", first.toString());const second = new Date(first);const newMinutes = second.getMinutes() + 30;console.log("new minutes:", newMinutes);second.setMinutes(newMinutes);console.log("second date:", second.toString());

单行无实用程序:

new Date(+new Date() + 60000*15) // +15 minutes
let d = new Date();d.setMinutes(d.getMinutes() + 30);
// console.log(d)
const MINUTE = 60 * 1000;new Date(Date.parse(yourDate) + numOfMins * MINUTE)