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

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

Если вы выполняете много работы с датами, вы можете посмотреть библиотеки дат JavaScript, например Datejs или Moment.js . Например, для Moment.js это просто:

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

Vanilla Javascript

Это похоже на ответ хаоса , но в одной строке:

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

Как указывают @squint и @mekdev, вы получаете лучшая производительность, сначала создав функцию вне цикла, а затем связав результаты внутри цикла. diff — это разница в минутах, которую вы хотите получить от время. Это может быть даже отрицательным. oldDateObj Или в качестве многоразовой функции, если вам нужно сделать это в нескольких местах:

Будьте осторожны с Vanilla Javascript. Даты трудны!

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

Вы можете подумать, что можете добавить 24 часа к дате, чтобы получить завтрашнюю дату, верно?

Оказывается, если пользователь соблюдает переход на летнее время, день не обязательно должен длиться 24 часа. Один день в году длится всего 23 часа, а один день в году — 25 часов. Например, в большинстве Соединенных Штатов и Канады 24 ноября после полуночи, 2 ноября 2014 года, по-прежнему 2 ноября: Я думал, что

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

Именно поэтому

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

использование одной из вышеупомянутых библиотек является более безопасной ставкой если вам нужно проделать большую работу с этим. MySQL DATE_ADD Рабочая демоверсия jsFiddle

Ниже приведена более общая версия эту функцию, которую я написал. Я все еще рекомендовал бы использовать библиотеку, но это может быть чрезмерно / невозможно для вашего проекта. Синтаксис смоделирован после Может быть, что-то вроде этого? .

/**
 * 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;
}

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

var d1 = new Date (),
    d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes()   30 );
alert ( d2 );
var oldDateObj = new Date();
var newDateObj = new Date();
newDateObj.setTime(oldDateObj.getTime()   (30 * 60 * 1000));
console.log(newDateObj);
var now = new Date();
now.setMinutes(now.getMinutes()   30); // timestamp
now = new Date(now); // Date object
console.log(now);

Вы можете увидеть пример здесь:

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

console.log(v)

http://jsfiddle.net/tiagoajacobi/YHA8x/

Это функции: . Каждый

работали, когда служили HTML:

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

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

Вот версия

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

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

Использовать существующую библиотеку, известную для обработки причуд, связанных с вычислениями времени. Мой текущий любимый: 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>

Еще одна опция, которую я написал:

Библиотека DP_DateExtensions

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

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

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

ответ Кипа (сверху) в 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