Gostaria de obter um objeto Date 30 minutos mais tarde que outro objeto Date. Como faço com JavaScript?
javascript
date
date-manipulation
Morgan Cheng
fonte
fonte
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);
d
agora é 30 minutos antes, e não depoisf
.f
ed
verá 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()
ambosf
ed
, verá quef
é maior qued
(ou seja, mais tarde).01:89
se tornaria02:29
, o que não existe no dia em que você "avançar". O Chrome decide que deve ser01:29
, o FF decide03:29
. Na noite em que você "recua", os dois navegadores pulam a hora de "recuo" e avançam 90 minutos, para02:29
. Aqui estão algumas demos do JSFiddle: "spring forward" / "fall back"Respostas:
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:
Javascript de baunilha
É como a resposta do caos , mas em uma linha:
Onde
diff
está a diferença em minutos que você deseja dooldDateObj
tempo. Pode até ser negativo.Ou como uma função reutilizável, se você precisar fazer isso em vários locais:
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!
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:
É 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 .
Trabalhando com a demonstração do jsFiddle .
fonte
fonte
Date
objetos.var d = new Date(); d.setMinutes(d.getMinutes() + 30);
fonte
setTime
retorna 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.)var in30Mins = new Date(+new Date() + 1.8e6)
é uma linha, mas não tem certeza de que é melhor do que uma linha. ;-)fonte
setMinutes
retorna o timestamp, masnow
permanece oDate
objeto, por issonow = new Date(now)
é obsoletoTalvez algo assim?
fonte
Date
objetos.var d = new Date(); d.setMinutes(d.getMinutes() + 30);
If a parameter you specify is outside of the expected range, setMinutes() attempts to update the date information in the Date object accordingly.
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:
Estas são as funções:
fonte
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.new Date().addHours(4).addMinutes(45);
Você pode chamar quantos quiser, porque os métodos retornam "this", que é o atual objeto de data.var dt = new Date();
thendt.addMinutes(45); dt.addHours(4);
ou mesmodt.addMinutes(285);
ou tambémdt.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.A maneira mais fácil de resolver é reconhecer que em datas javascript são apenas números. Começa
0
ou'Wed Dec 31 1969 18:00:00 GMT-0600 (CST)
. Cada1
um 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.fonte
É isso que faço, que parece funcionar muito bem:
Então você pode chamar assim:
fonte
return new Date(this.getTime() + minutes * 60000);
, eu o copiedDate provisório não é necessário. ;-)Aqui está a versão do ES6 :
Chame assim:
fonte
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 )
fonte
Para os preguiçosos como eu:
A resposta de Kip (de cima) em coffeescript, usando um "enum" e operando no mesmo objeto:
fonte
Use uma biblioteca existente conhecida para lidar com as peculiaridades envolvidas no tratamento de cálculos de tempo. Meu favorito atual é moment.js .
fonte
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.
fonte
Você poderia fazer isso:
fonte
Aqui está o meu one-liner:
fonte
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
fonte
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!
fonte