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


782

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


1
我在js上(在Github上)构建了一个小的日历弹出脚本,也许浏览一下代码以了解date对象是如何与之相交的。另外,请检查Javascript Kit作为其出色的js参考,尤其是对于date对象。
基督教徒

2
下面所有使用变体形式的答案都date.setMinutes(date.getMinutes() + ...)将无法越过夏时制边界。例如(假设“ 2014-03-09”是夏令时的边界): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); d现在比早30分钟(不晚于)f
Spig 2014年

1
@Spig:在DST边界的凌晨1:59后30分钟是凌晨1:29。没有错误。如果打印fd,您会看到一个显示“ GMT-0500”,另一个显示“ GMT-0400”(或您所在的时区)。另外,如果你调用.getTime()两个fd,你会看到,f大于d(即更高版本)。
2014年

1
@Spig:有趣,在Firefox上尝试了一下,它起作用了。我认为在getMinutes()应该如何工作的规范中,它属于灰色区域。01:89会变成02:29,这在您“向前发展”的那天就不存在。Chrome决定应该是01:29,FF决定03:29。在您“后退”的夜晚,两个浏览器都跳过了“后退”一小时,向前跳了90分钟,到达02:29。这是一些JSFiddle演示:“向后弹” / “向后
Kip

1
如果以下答案之一回答了您的问题,则本网站的工作方式正常运行,您将“接受”答案,更多信息请参见:当有人回答我的问题时我该怎么办?。但前提是您的问题确实得到了回答。如果没有,请考虑为问题添加更多详细信息。
再见StackExchange

Answers:


949

使用图书馆

如果您要进行大量的日期工作,则可能需要研究诸如DatejsMoment.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);
}

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

小心香草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!

这就是为什么如果必须为此做很多工作的话,使用上述库之一是更安全的选择

下面是我编写的此函数的更通用版本。我仍然建议您使用一个库,但这对于您的项目而言可能是多余的/不可能的。该语法是在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) {
  if(!(date instanceof Date))
    return undefined;
  var ret = new Date(date); //don't change original date
  var 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演示


14
这非常强大;即使数字为负,它也可以工作任何分钟。
瓦希德比塔尔

3
在几秒钟内,乘以1000而不是60k。
ashes999

2
dateAdd()函数很棒!但是我有一个注释-从语义上讲,单位应为“分钟”,“秒”等,并且间隔应为数量(2、10、45等),反之亦然。否则,这个主意是好的。
Vasil Popov

1
此答案无法容纳月份的总和,因此1月31日加上1个月将决定3月2日或3月3日,具体取决于是否为leap年。Jacobi的答案中的addMonthsaddYears函数对此进行了处理,因此对我来说,这是一个更好的答案。
RobG'3

1
@RobG好点。我为此添加了一个修复程序,并进一步强调了“尽可能使用库”这一点。
基普(Kip)

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

114
@Jamie:您不需要两个Date对象。var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner,2009年

15
@Grant:我假设d2 =“我想获取一个Date对象”和d1 =“到另一个Date对象”
杰米

7
@ CKeene,setMinutes和getMinutes是普通的旧Javascript的一部分(尽管datejs确实提供了很多其他东西)。
2012年

4
仅供参考-这可能会跨越夏令时界限。JSFiddle演示:“往前弹” / “向后 (感谢@Spig)
Kip

@trevorgrayson如果您指定的参数超出预期范围,则setMinutes()会尝试相应地更新日期信息。例如,如果您使用100,则小时数将增加1,而40将使用数分钟。
Mihai Crăiță 2014年

155

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


3
请注意,setTime返回的是数字毫秒时间戳,而不是日期对象。(不要以为你可以做一个单缸客机。)
艾伦·H。

12
var in30Mins = new Date(+new Date() + 1.8e6)是单线的,但不确定是否比两线的更好。;-)
RobG

112

var now = new Date();
now.setMinutes(now.getMinutes() + 30); // timestamp
now = new Date(now); // Date object
console.log(now);


9
注意到我发布了此副本。已删除并+1。
Izzy

3
这个问题的最简单答案
vijay

我认为setMinutes返回时间戳,但now仍然是Date对象,因此now = new Date(now)已过时
p.boiko

46

也许是这样的吗?

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

console.log(v)


6
@ Chacha102:您不需要两个Date对象。var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner,2009年

12
他想要两个约会对象。阅读问题。一个日期对象比另一日期对象早30分钟。
泰勒·卡特

5
如果循环超过一个小时,此方法还可以吗?因此,如果我在11:59打电话给它,可以在12:29安排好吗?
克里斯·雷

1
@ChrisRae是的,确实如此。If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
fridoo

35

我总是创建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;
        };

有人可以看到这种方法有什么问题吗?
Dembinski

1
请改用moment.js
Victor Pudeyev,2016年

@TheDembinski-您期待什么问题?通常不喜欢扩展内置函数,但是我看不到Date的问题。如果每个主要增量还可以选择设置其次要增量(如set *方法那样),那就太好了,因此addHours可以选择花费几分钟,几秒钟和几毫秒,因此您可以date.addHours(3, 30)添加3小时30分钟。addYears将花费数年,数月和几天,addMonths将花费数月和数天,addMinutes将花费数分钟,秒,毫秒等
。– RobG

1
嗨@transformer我会做这样的事情new Date().addHours(4).addMinutes(45);您可以调用任意数量的调用,因为方法返回的是当前日期对象的“ this”。
Jacobi

1
嗨@transformer,我不确定我是否理解您的问题,但是这些都是原型函数,您可以按所需的任何顺序使用,例如: var dt = new Date();那么dt.addMinutes(45); dt.addHours(4);,甚至什dt.addMinutes(285);dt.addMinutes(45).addHours(4);全部都可以使用。如果您对某个代码示例有疑问,请将您的问题发布在这里,我们将竭诚为您服务。
Jacobi

13

解决最简单的方法是认识到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)

9

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

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

1
您可以这样做return new Date(this.getTime() + minutes * 60000);,但我不需要临时copyDate。;-)
RobG

5

这是ES6版本:

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

像这样称呼它:

getTimeAfter30Mins();

我让用户输入4:30 hr + 2:15 hrs / mins,如何让用户通过小时和分钟,并将其添加到现有的小时分钟中。
变压器

@transformer可以为小时,分钟等提供不同的输入字段,以进行数字验证。
xameeramir

5

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

我必须承认这是有创造力的。但是人..这很难读!
Erik Baan

2

对于像我这样的懒人:

Kip在coffeescript中的答案(从上方),使用“枚举”,并且对同一对象进行操作:

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

2

使用已知的现有库来处理与时间计算有关的怪癖。我当前最喜欢的是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 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>

3
如果您不给出理由就投反对票,答案将无济于事。
Ouroborus '16

OP要求使用JavaScript解决方案,而不是框架/库。
mattpark22 '16

2
@ mattpark22虽然我了解您的意思,但是javascript库仍然是javascript。我可以只摘录库的相关部分,并将其作为代码解决方案呈现。从您的意思上说,OP的答案是javascript,但没有意识到(可能)可接受的通用解决方案。而且,增加30分钟的时间并不像大多数答案听起来那么简单,因为Date对象无法处理很多边缘情况。例如,越过DST边界,最流行的答案就会中断。
Ouroborus '16

@Ouroborus-如果OP未在OP或标签中要求提供库,则不应将库作为唯一的解决方案。否则,答案可能只是在不同库中做某事的一种方式,OP对他们的实际问题就不那么明智了(在这种情况下,解决这个问题很简单)。
RobG'3

1
@RobG没有人建议只提供图书馆解决方案。OP不能专门要求提供库,因为这会使问题不合时宜。问“如何使用JavaScript?” 可以解释为指定这是特定于javascript的(特别是在标题和标签中重复此详细信息的情况下)(以特定语言寻求解决方案,而不是请求原始代码解决方案)。
Ouroborus

1

我写的另一种选择:

DP_DateExtensions库

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

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


1

您可以这样做:

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



1

您应该获取当前日期的值,以(ms)来获取日期,并将其加上(30 * 60 * 1000)。现在您有了(当前日期+ 30分钟)的毫秒数

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


0

我知道这个话题太老了。但是我可以肯定的是,仍然有一些开发人员仍然需要这个,所以我为您制作了这个简单的脚本。我希望你喜欢它!

function strtotime(date, addTime){
  let generatedTime=date.getTime();
  if(addTime.seconds) generatedTime+=1000*addTime.seconds; //check for additional seconds 
  if(addTime.minutes) generatedTime+=1000*60*addTime.minutes;//check for additional minutes 
  if(addTime.hours) generatedTime+=1000*60*60*addTime.hours;//check for additional hours 
  return new Date(generatedTime);
}

let futureDate = strtotime(new Date(), {
    hours: 1, //Adding one hour
    minutes: 45, //Adding fourty five minutes
    seconds: 0 //Adding 0 seconds return to not adding any second so  we can remove it.
});
<button onclick="alert(futureDate)">Travel to the future</button>

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.