Como obtenho o número de dias entre duas datas no JavaScript? Por exemplo, com duas datas nas caixas de entrada:
<input id="first" value="1/1/2000"/>
<input id="second" value="1/1/2001"/>
<script>
alert(datediff("day", first, second)); // what goes here?
</script>
javascript
date
Michael Haren
fonte
fonte
Respostas:
Aqui está uma implementação rápida e suja de
datediff
, como uma prova de conceito para resolver o problema, conforme apresentado na pergunta. Ele se baseia no fato de que você pode obter os milissegundos decorridos entre duas datas subtraindo-os, o que os coage em seu valor numérico primitivo (milissegundos desde o início de 1970).Você deve estar ciente de que as APIs de data "normais" (sem "UTC" no nome) operam no fuso horário local do navegador do usuário; portanto, em geral, você pode ter problemas se o usuário estiver em um fuso horário que você não faz. espere, e seu código terá que lidar com as transições do horário de verão. Você deve ler atentamente a documentação do objeto Date e seus métodos e, para algo mais complicado, considere usar uma biblioteca que ofereça APIs mais seguras e poderosas para manipulação de datas.
Date
- Referência JavaScript MDNAlém disso, para fins de ilustração, o snippet usa acesso nomeado ao
window
objeto por questões de brevidade, mas na produção você deve usar APIs padronizadas como getElementById ou, mais provavelmente, alguma estrutura da interface do usuário.fonte
parseDate
método a ser:return new Date(mdy[2], mdy[1], mdy[0]-1);
No momento da redação deste documento, apenas uma das outras respostas manipula corretamente as transições de horário de verão. Aqui estão os resultados em um sistema localizado na Califórnia:
Embora
Math.round
retorne os resultados corretos, acho que é um pouco desajeitado. Em vez disso, explicando explicitamente as alterações no deslocamento UTC quando o horário de verão começa ou termina, podemos usar a aritmética exata:Explicação
Os cálculos de data do JavaScript são complicados porque os
Date
objetos armazenam horários internamente no UTC, e não no horário local. Por exemplo, 3/10/2013 00:00 (horário padrão do Pacífico) (UTC-08: 00) é armazenado como 10/10/2013 8:00 (UTC) e 11/03/2013 12:00 (horário do Pacífico) ( UTC-07: 00) é armazenado como 11/3/2013 07:00 UTC. Neste dia, a hora local da meia-noite à meia-noite é de apenas 23 horas no UTC!Embora um dia no horário local possa ter mais ou menos de 24 horas, um dia no UTC é sempre exatamente 24 horas. 1 O
daysBetween
método mostrado acima aproveita esse fato ligando primeirotreatAsUTC
para ajustar os horários locais à meia-noite UTC, antes de subtrair e dividir.1. JavaScript ignora segundos bissextos.
fonte
Date.UTC(...)
em primeiro lugar.A maneira mais fácil de obter a diferença entre duas datas:
Você obtém os dias de diferença (ou NaN se um ou ambos não puderam ser analisados). A data da análise deu o resultado em milissegundos e, para obtê-lo por dia, você deve dividi-lo por 24 * 60 * 60 * 1000
Se você deseja dividir por dias, horas, minutos, segundos e milissegundos:
Aqui está minha versão refatorada da versão de James:
fonte
Eu recomendo usar a biblioteca moment.js ( http://momentjs.com/docs/#/displaying/difference/ ). Ele lida corretamente com o horário de verão e, em geral, é ótimo trabalhar com ele.
Exemplo:
fonte
end.diff(start,"days")
embora o código escrito funcione porque a data de início é posterior à data de término!Eu iria em frente e pegaria esse pequeno utilitário e nele você encontrará funções para isso. Aqui está um pequeno exemplo:
fonte
Atualização: Eu sei que isso não faz parte de suas perguntas, mas, em geral, eu não recomendaria fazer nenhum cálculo ou manipulação de data no JavaScript vanilla e preferir usar uma biblioteca como date-fns ou moment.js devido a muitos casos extremos .
fonte
timeDiff
retornou no negativo? Não deveriatimeDiff
ser(new Date(endDate)) - (new Date(startDate));
?(new Date('2017-11-08')) - (new Date('2017-10-01')) // 3283200000
const timeDiff = +(new Date(start)) - +(new Date(end));
return (Date.UTC(yr2, mo2-1, dy2) - Date.UTC(yr1, mo1-1, dy1)) / 86400000;
Usando Moment.js
fonte
var now = moment(), yearStart = moment().startOf('year'); var ytdDays = now.diff(yearStart, 'days'); // this can be years, months, weeks, days, hours, minutes, and seconds console.log(ytdDays);
aqui: momentjs.comOs valores de data em JS são valores de data e hora.
Portanto, cálculos de datas diretas são inconsistentes:
por exemplo, precisamos converter a segunda data:
o método pode truncar os moinhos nas duas datas:
fonte
Melhor se livrar do horário de verão, Math.ceil, Math.floor etc. usando os horários UTC:
Este exemplo dá diferença 109 dias.
24*60*60*1000
é um dia em milissegundos.fonte
Para calcular os dias entre 2 datas, você pode usar o código a seguir. As datas que eu uso aqui são 01 de janeiro de 2016 e 31 de dezembro de 2016
fonte
É possível calcular uma diferença de dias completos de prova entre duas datas em diferentes ZTs usando a seguinte fórmula:
fonte
Encontrei essa pergunta quando quero calcular algumas duas datas, mas a data tem horas e minutos, modifiquei a resposta de @ michael-liu para atender às minhas necessidades e ela passou no teste.
dias de diferença
2012-12-31 23:00
e2013-01-01 01:00
deve ser igual a 1. (2 horas) dias de diferença2012-12-31 01:00
e2013-01-01 23:00
deve ser igual a 1. (46 horas)fonte
exemplo jsfiddle :)
fonte
Eu acho que as soluções não estão corretas 100% Eu usaria o teto em vez do piso , a rodada funcionará, mas não é a operação correta.
fonte
Que tal usar o formatDate do widget DatePicker? Você pode usá-lo para converter as datas no formato de carimbo de data / hora (milissegundos desde 01/01/1970) e depois fazer uma subtração simples.
fonte
fonte
Esta pode não ser a solução mais elegante, mas parece responder à pergunta com um pouco de código relativamente simples, eu acho. Você não pode usar algo assim:
Isso pressupõe que você esteja passando objetos de data como parâmetros.
fonte
Se você tiver dois registros de data e hora unix, poderá usar esta função (tornada um pouco mais detalhada por uma questão de clareza):
Exemplo:
fonte
Tenha cuidado ao usar milissegundos .
O date.getTime () retorna milissegundos e a operação matemática com milissegundos exige a inclusão
O exemplo do comentário acima é a melhor solução que encontrei até agora https://stackoverflow.com/a/11252167/2091095 . Mas use +1 no resultado se desejar contar todos os dias envolvidos.
fonte
fonte
Eu tive o mesmo problema no Angular. Eu faço a cópia, porque mais ele substituirá o primeiro encontro. Ambas as datas devem ter tempo 00:00:00 (obviamente)
fonte
Usei o código abaixo para experimentar a funcionalidade da data de postagem de uma publicação.Eu calculo o minuto ou a hora ou o dia ou o ano com base na data de postagem e na data atual.
fonte
se você quiser ter um DateArray com datas, tente o seguinte:
DebugSnippet
fonte
A maneira simples de calcular os dias entre duas datas é remover o componente de tempo, ou seja, definir horas, minutos, segundos e milissegundos para 0 e subtrair o tempo e mergulhá-lo com milissegundos no valor de um dia.
fonte
new Date
fonte
Simples, fácil e sofisticado. Essa função será chamada a cada 1 segundo para atualizar o tempo.
fonte
Uma solução melhor
retornará 0 se as duas datas forem iguais.
fonte
Uma contribuição, para data anterior a 01-01-2009 e após 2038-01-19
fonte
fonte
Você pode usar o UnderscoreJS para formatar e calcular a diferença.
Demo https://jsfiddle.net/sumitridhal/8sv94msp/
fonte