Como adicionar 30 minutos a um objeto Data JavaScript?

785

Gostaria de obter um objeto Date 30 minutos mais tarde que outro objeto Date. Como faço com JavaScript?

Morgan Cheng
fonte
1
Eu criei um pequeno script pop-up de calendário no js, ​​no Github , talvez veja o código para ver como o objeto date é interado. Além disso, verifique o Javascript Kit como uma referência js impressionante, especialmente para o objeto de data.
Christian
2
Todas as respostas abaixo que usam uma variação de date.setMinutes(date.getMinutes() + ...)falharão ao cruzar os limites do horário de verão. Por exemplo (supondo que '2014-03-09' seja um limite de horário de verão): var d = new Date('2014-03-09 01:59:00'), f = new Date(d.getTime()); d.setMinutes(d.getMinutes() + 30); dagora é 30 minutos antes, e não depois f.
Spig
1
@ Spig: 30 minutos depois das 01h59 no horário de verão é 01h29. Não há erro. Se você imprimir fe dverá um diz "GMT-0500", o outro diz "GMT-0400" (ou seja qual for o seu fuso horário). Além disso, se você chamar .getTime()ambos fe d, verá que fé maior que d(ou seja, mais tarde).
Kip
1
@ Spig: interessante, tentei no Firefox e funcionou. Eu acho que cai em uma área cinza na especificação de como getMinutes () deve funcionar. 01:89se tornaria 02:29, o que não existe no dia em que você "avançar". O Chrome decide que deve ser 01:29, o FF decide 03:29. Na noite em que você "recua", os dois navegadores pulam a hora de "recuo" e avançam 90 minutos, para 02:29. Aqui estão algumas demos do JSFiddle: "spring forward" / "fall back"
Kip
1
Se uma das respostas abaixo responder à sua pergunta, da forma como este site funciona, você "aceitará" a resposta, mais aqui: O que devo fazer quando alguém responder à minha pergunta? . Mas somente se sua pergunta realmente tiver sido respondida. Caso contrário, considere adicionar mais detalhes à pergunta.
Adeus StackExchange

Respostas:

951

Usando uma biblioteca

Se você trabalha muito com datas, pode procurar em bibliotecas de datas JavaScript, como Datejs ou Moment.js . Por exemplo, com Moment.js, isso é simplesmente:

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

Javascript de baunilha

É como a resposta do caos , mas em uma linha:

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

Onde diffestá a diferença em minutos que você deseja do oldDateObjtempo. Pode até ser negativo.

Ou como uma função reutilizável, se você precisar fazer isso em vários locais:

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

E, caso isso não seja óbvio, a razão pela qual multiplicamos minutos 60000é converter minutos em milissegundos.

Cuidado com o Vanilla Javascript. As datas são difíceis!

Você pode adicionar 24 horas a uma data para obter a data de amanhã, certo? Errado!

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

Acontece que, se o usuário observar o horário de verão, o dia não será necessariamente de 24 horas. Há um dia por ano com apenas 23 horas e um dia por ano com 25 horas. Por exemplo, na maioria dos Estados Unidos e Canadá, 24 horas após a meia-noite de 2 de novembro de 2014, ainda é 2 de novembro:

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!

É por isso que usar uma das bibliotecas mencionadas acima é uma aposta mais segura se você tiver que trabalhar muito com isso.

Abaixo está uma versão mais genérica dessa função que escrevi. Eu ainda recomendo usar uma biblioteca, mas isso pode ser um exagero / impossível para o seu projeto. A sintaxe é modelada após a função 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;
}

Trabalhando com a demonstração do jsFiddle .

Kip
fonte
14
Isso é muito poderoso; Funciona por qualquer quantidade de minutos, mesmo que o número seja negativo.
Wahid Bitar
3
Por segundos, multiplique por 1000 em vez de 60k.
precisa saber é o seguinte
2
A função dateAdd () é ótima! Mas há uma nota minha - semanticamente, a unidade deve ser "minuto", "segundo" etc. e o intervalo deve ser a quantidade (2, 10, 45, ...), e não vice-versa. Caso contrário, a ideia é boa.
Vasil Popov
1
Essa resposta não consegue acomodar as rolagens do mês, portanto, 31 de janeiro e mais um mês dão 2 ou 3 de março, dependendo se é um ano bissexto ou não. Os AddMonths e AddYears funções no negócio resposta de Jacobi com que então para mim, é uma resposta melhor.
RobG
1
@RobG Bom ponto. Eu adicionei uma correção para isso e enfatizei ainda mais o ponto "use uma biblioteca, se possível".
Kip
238
var d1 = new Date ();
var d2 = new Date ( d1 );
d2.setMinutes ( d1.getMinutes() + 30 );
alert ( d2 );
Jamie
fonte
114
@ Jamie: Você não precisa de dois Dateobjetos. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner
15
@Grant: eu assumi d2 = "Gostaria de obter um objeto Date" e D1 = "para outro objeto Date"
Jamie
7
@CKeene, setMinutes e getMinutes fazem parte do antigo e simples Javascript (embora o datejs forneça várias outras coisas).
S29
4
Para sua informação, isso pode ultrapassar os limites do horário de verão. Demonstrações do JSFiddle: "spring forward" / "fall back" (Obrigado @Spig por isso) #
Kip
@trevorgrayson Se um parâmetro especificado estiver fora do intervalo esperado, setMinutes () tentará atualizar as informações da data de acordo. Por exemplo, se você usar 100, as horas serão incrementadas em 1 e 40 serão usadas por minutos.
Mihai Crăiță
155

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

caos
fonte
3
Observe que setTimeretorna um carimbo de data / hora numérico de milissegundos, não um objeto de data. (Não pense que você pode fazer um one-liner.)
Alan H.
12
var in30Mins = new Date(+new Date() + 1.8e6)é uma linha, mas não tem certeza de que é melhor do que uma linha. ;-)
RobG
112

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

Teo Graca
fonte
9
Notei que publiquei uma duplicata disso. Excluído e marcado com +1.
Izzy
3
resposta mais simples para esta pergunta
vijay
Eu acho que setMinutesretorna o timestamp, mas nowpermanece o Dateobjeto, por isso now = new Date(now)é obsoleto
p.boiko 03/04
46

Talvez algo assim?

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

console.log(v)

Tyler Carter
fonte
6
@ Chacha102: Você não precisa de dois Dateobjetos. var d = new Date(); d.setMinutes(d.getMinutes() + 30);
Grant Wagner
12
Ele queria dois objetos de encontro. Leia a pergunta. Um objeto de data 30 minutos à frente de outro objeto de data.
Tyler Carter
5
Isso funciona se o loop ultrapassar a hora? Então, se eu ligar às 11h59, ele está programado às 12h29?
Chris Rae
1
@ChrisRae sim, faz. If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
fridoo 26/03/19
35

Eu sempre crio 7 funções, para trabalhar com a data em JS: addSeconds, addMinutes, addHours, addDays, addWeeks, addMonths, addYears.

Você pode ver um exemplo aqui: http://jsfiddle.net/tiagoajacobi/YHA8x/

Como usar:

var now = new Date();
console.log(now.addMinutes(30));
console.log(now.addWeeks(3));

Estas são as funções:

        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
fonte
Alguém pode ver algum problema com essa abordagem?
The Dembinski
1
use moment.js em vez disso
Victor Pudeyev
@ TheDembinski - que problemas você espera? Geralmente, não é possível estender os built-ins, mas não vejo um problema com o Date. Seria bom se cada incremento principal também configurasse opcionalmente seus incrementos menores (como os métodos set * ), portanto addHours opcionalmente levou minutos, segundos e milissegundos para que você pudesse date.addHours(3, 30)adicionar 3 horas e 30 minutos. AddYears levaria anos, meses e dias, AddMonths levaria meses e dias, AddMinutes levaria minutos, segundos, milissegundos, etc.
RobG
1
Oi @transformer Eu faria algo assim new Date().addHours(4).addMinutes(45);Você pode chamar quantos quiser, porque os métodos retornam "this", que é o atual objeto de data.
Jacobi
1
Olá @transformer, não sei se entendi o seu problema, mas estas são funções de protótipo, você pode usar na ordem que quiser, ex: var dt = new Date();then dt.addMinutes(45); dt.addHours(4);ou mesmo dt.addMinutes(285);ou também dt.addMinutes(45).addHours(4);tudo funcionará. Se você tiver alguma dúvida com algum exemplo de código, para o seu problema, poste aqui. Será um prazer ajudá-lo.
27917 Jacobi
13

A maneira mais fácil de resolver é reconhecer que em datas javascript são apenas números. Começa 0ou 'Wed Dec 31 1969 18:00:00 GMT-0600 (CST). Cada 1um representa um milissegundo. Você pode adicionar ou subtrair milissegundos obtendo o valor e instanciando uma nova data usando esse valor. Você pode gerenciar isso com bastante facilidade com essa mente.

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
fonte
10

É isso que faço, que parece funcionar muito bem:

Date.prototype.addMinutes = function(minutes) {
    var copiedDate = new Date(this.getTime());
    return new Date(copiedDate.getTime() + minutes * 60000);
}

Então você pode chamar assim:

var now = new Date();
console.log(now.addMinutes(50));
Jonathan
fonte
2
Você poderia simplesmente fazer return new Date(this.getTime() + minutes * 60000);, eu o copiedDate provisório não é necessário. ;-)
RobG
5

Aqui está a versão do ES6 :

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

Chame assim:

getTimeAfter30Mins();
xameeramir
fonte
Eu tenho usuários inserindo 4:30 hr + 2:15 hrs / min. Como posso permitir que os usuários passem horas e minutos e adicioná-los a um número de horas existente.
transformador
@transformer, você pode fornecer campos de entrada diferentes por horas, minutos e assim por diante, com validações numéricas.
Xameeramir
5

Sinto que muitas das respostas aqui carecem de um componente criativo, muito necessário para os cálculos de viagens no tempo. Apresento minha solução para uma tradução temporal de 30 minutos.

(jsfiddle aqui )

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]());
}
não sincronizado
fonte
Eu tenho que admitir que isso é criativo. Mas cara .. Isso é difícil de ler!
Erik Baan
2

Para os preguiçosos como eu:

A resposta de Kip (de cima) em coffeescript, usando um "enum" e operando no mesmo objeto:

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
fonte
2

Use uma biblioteca existente conhecida para lidar com as peculiaridades envolvidas no tratamento de cálculos de tempo. Meu favorito atual é 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>
Ouroborus
fonte
3
As respostas não podem melhorar se você fizer um voto negativo sem apresentar um motivo.
Ouroborus
O OP solicitou uma solução JavaScript, não uma estrutura / biblioteca.
mattpark22
2
@ mattpark22 Embora eu entenda o que você está dizendo, uma biblioteca javascript ainda é javascript. Eu poderia extrair apenas as partes relevantes da biblioteca e apresentá-las como uma solução de código. O OP teria uma resposta que era javascript, no sentido em que você está falando sério, mas não teria conhecimento de uma solução (possivelmente) aceitável de uso geral. Além disso, adicionar 30 minutos não é tão trivial quanto a maioria das respostas soa, pois há muitos casos extremos não tratados pelo objeto Date. Por exemplo, a resposta mais popular é interrompida ao cruzar os limites do horário de verão.
Ouroborus
@ Ouroborus - as bibliotecas não devem ser a única solução fornecida se o OP não solicitou uma biblioteca no OP ou nas tags. Caso contrário, as respostas podem se tornar apenas uma ladainha de maneiras de se fazer algo em diferentes bibliotecas, e o OP não é mais sábio para o seu problema real (que neste caso é bastante trivial de resolver).
RobG 01/03
1
@RobG Ninguém está sugerindo que apenas sejam fornecidas soluções de biblioteca. O OP não pode solicitar especificamente uma biblioteca, pois isso faria com que a pergunta fosse fora de tópico. Perguntando "Como faço isso com JavaScript?" pode ser interpretado como especificando que isso é específico ao javascript (solicitando uma solução em um idioma específico, em vez de solicitar uma solução de código bruto), especialmente porque esse detalhe é repetido no título e nas tags.
Ouroborus 01/03
1

Apenas outra opção, que escrevi:

Biblioteca DP_DateExtensions

É um exagero se esse for o processamento de todas as datas necessárias, mas ele fará o que você deseja.

Suporta formatação de data / hora, matemática da data (adicionar / subtrair partes da data), comparação de datas, análise de datas, etc. É de código aberto.

Jim Davis
fonte
1

Você poderia fazer isso:

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

rayalois22
fonte
1

Aqui está o meu one-liner:

console.log('time: ', new Date(new Date().valueOf() + 60000))

Jason Mullings
fonte
1

Você deve obter o valor da data atual para obter a data com (ms) e adicionar (30 * 60 * 1000) a ela. Agora você tem (data atual + 30 min) com ms

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

Abdulrahman Fawzy
fonte
0

Eu sei que o tópico é muito antigo. Mas tenho certeza de que alguns desenvolvedores ainda precisam disso, então fiz esse script simples para você. Espero que você goste!

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>

Adnane Ar
fonte