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

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

Ответ 1

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

Если вы выполняете много работы с датами, вы можете посмотреть библиотеки дат JavaScript, такие как Datejs или Moment.js. Например, для 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);
}

And just in case this is not obvious, the reason we multiply minutes by [TG45] is to convert minutes to milliseconds.

Будьте осторожны с ванильным Javascript. Даты трудны!

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

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

Оказывается, если пользователь соблюдает переход на летнее время, день не обязательно должен длиться 24 часа. Один день в году длится всего 23 часа, а один день в году - 25 часов. Например, в большинстве Соединенных Штатов и Канады 24 ноября после полуночи, 2 ноября 2014 г., по-прежнему 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.

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

console.log(v)

Ответ 6

Я всегда создаю 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;
        };

Ответ 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)

Ответ 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));

Ответ 9

Вот версия ES6:

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

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

getTimeAfter30Mins();

Ответ 10

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

Ответ 11

Для ленивого, как я:

Ответ на 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

Ответ 12

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

Ответ 13

Еще один вариант, который я написал:

Библиотека DP_DateExtensions

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

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