Как добавить 30 минут к объекту JavaScript Date?

Я хотел бы получить объект Date, который на 30 минут позже, чем другой объект Date. Как мне сделать это с помощью JavaScript?

вопрос задан 29.07.2009
Morgan Cheng
27512 репутация

13 ответов


  • 769 рейтинг

    Использование библиотеки

    Если вы выполняете много работы с датами, вы можете обратиться к библиотекам дат JavaScript, таким как Datejs или Moment. JS . Например, с Моментом. 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 часов. Например, в большинстве Соединенных Штатов и Канады 24 ноября после полуночи, 2 ноября 2014 г., по-прежнему 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 .

    ответ дан Kip, с репутацией 64794, 31.07.2009
  • 181 рейтинг
    var d1 = new Date (),
        d2 = new Date ( d1 );
    d2.setMinutes ( d1.getMinutes() + 30 );
    alert ( d2 );
    
    ответ дан Jamie, с репутацией 3603, 29.07.2009
  • 127 рейтинг
    var newDateObj = new Date();
    newDateObj.setTime(oldDateObj.getTime() + (30 * 60 * 1000));
    
    ответ дан chaos, с репутацией 101674, 29.07.2009
  • 65 рейтинг
    var now = new Date();
    now.setMinutes(now.getMinutes() + 30);
    
    ответ дан Teo Graca, с репутацией 651, 14.06.2010
  • 31 рейтинг

    Может как то так?

    var d = new Date();
    var v = new Date();
    v.setMinutes(d.getMinutes()+30);
    
    ответ дан Tyler Carter, с репутацией 47878, 29.07.2009
  • 27 рейтинг

    Я всегда создаю 7 функций для работы с датой в JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.

    Вы можете увидеть пример здесь: http: // jsfiddle. нетто / 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;
            };
    
    ответ дан Jacobi, с репутацией 1004, 19.03.2014
  • 8 рейтинг

    Это то, что я делаю, что, кажется, работает довольно хорошо:

    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));
    
    ответ дан Jonathan, с репутацией 509, 15.10.2013
  • 7 рейтинг

    Самый простой способ решить эту проблему - распознать, что в 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)
    
    ответ дан tsacodes, с репутацией 221, 20.11.2017
  • 4 рейтинг

    Я чувствую, что во многих ответах здесь отсутствует креативный компонент, очень необходимый для вычислений путешествий во времени. Я представляю свое решение для временного перевода 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]());
    }
    
    ответ дан unsynchronized, с репутацией 3897, 7.05.2017
  • 4 рейтинг

    Вот версия ES6 :

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

    Назовите это как:

    getTimeAfter30Mins();
    
    ответ дан student, с репутацией 9485, 13.04.2017
  • 1 рейтинг

    Просто еще один вариант, о котором я писал:

    Библиотека DP_DateExtensions

    Это излишне, если это вся обработка данных, которая вам нужна, но она будет делать то, что вы хотите.

    Поддерживает форматирование даты / времени, математику даты (сложение / вычитание частей даты), сравнение даты, разбор даты и т. Д. Это либерально с открытым исходным кодом.

    ответ дан Jim Davis, с репутацией 1180, 14.08.2009
  • 1 рейтинг

    Для ленивых, как я:

    Ответ Кипа (сверху) в 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
    
    ответ дан Blaskovicz, с репутацией 3447, 19.02.2015
  • 1 рейтинг

    Использовать существующую библиотеку, известную для обработки причуд, связанных с расчетами времени. Мой текущий любимый момент - . JS .

    
    
    
    
    ответ дан Ouroborus, с репутацией 6000, 16.06.2016