首页 文章

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

提问于
浏览
627

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

13 回答

  • 9

    使用库

    如果您正在进行大量的日期工作,您可能需要查看JavaScript日期库,如DatejsMoment.js . 例如,使用Moment.js,这只是:

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

    香草Javascript

    这就像chaos's answer,但是在一行中:

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

    diffoldDateObj 时间内您想要的分钟数差异 . 它甚至可能是消极的 .

    或者作为可重用的函数,如果您需要在多个位置执行此操作:

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

    小心使用Vanilla 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!
    

    这就是为什么 using one of the afore-mentioned libraries is a safer bet 如果你必须做很多工作 .

    下面是我写的这个函数的更通用的版本 . 我仍然建议使用一个库,但这对你的项目来说可能是过度/不可能的 . 语法在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;
    }
    

    Working jsFiddle demo .

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

    也许是这样的?

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

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

    这就是我所做的,它看起来效果很好:

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

    最简单的解决方法是识别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)
    
  • 1

    这是 ES6 版本:

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

    称之为:

    getTimeAfter30Mins();
    
  • 128

    我觉得这里的许多答案都缺乏创意组件,非常需要时间旅行计算 . 我提出了30分钟的时间翻译解决方案 .

    (jsfiddle here

    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]());
    }
    
  • 1

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

    DP_DateExtensions Library

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

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

  • 4

    像我一样懒惰:

    Kip在coffeescript中的答案(从上面开始),使用“enum”,并在同一个对象上操作:

    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
    
  • 191

    使用已知的现有库来处理处理时间计算所涉及的怪癖 . 我目前最喜欢的是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>
    

相关问题