Como calcularia a diferença para dois objetos Date () em JavaScript, enquanto retornava apenas o número de meses na diferença?
Qualquer ajuda seria ótimo :)
javascript
date
datediff
williamtroup
fonte
fonte
Respostas:
A definição de "o número de meses na diferença" está sujeita a muita interpretação. :-)
Você pode obter o ano, mês e dia do mês a partir de um objeto de data JavaScript. Dependendo das informações que você está procurando, você pode usá-las para descobrir quantos meses existem entre dois pontos no tempo.
Por exemplo, fora do punho:
Mostrar snippet de código
(Observe que os valores do mês no JavaScript começam com 0 = janeiro.)
A inclusão de meses fracionários acima é muito mais complicada, porque três dias em fevereiro típico são uma fração maior desse mês (~ 10,714%) do que três dias em agosto (~ 9.677%) e, é claro, até fevereiro é uma meta em movimento dependendo se é um ano bissexto.
Existem também algumas bibliotecas de data e hora disponíveis para JavaScript que provavelmente facilitam esse tipo de coisa.
Nota : Havia um
+ 1
no acima, aqui:Isso porque originalmente eu disse:
Eu o removi por dois motivos:
Não contar meses parciais acaba não sendo o que muitas (a maioria?) Das pessoas que estão chegando à resposta querem, então pensei em separá-las.
Nem sempre funcionou mesmo com essa definição. :-D (Desculpe.)
fonte
Se você não considera o dia do mês, essa é de longe a solução mais simples
Esteja ciente de que o índice do mês é baseado em 0. Isso significa que
January = 0
eDecember = 11
.fonte
Às vezes, você pode querer obter apenas a quantidade de meses entre duas datas, ignorando totalmente a parte do dia. Por exemplo, se você teve duas datas - 2013/06/21 e 2013/10/18 - e se importou apenas com as partes 2013/06 e 2013/10, aqui estão os cenários e as possíveis soluções:
1.Se você deseja apenas o número de meses entre as duas datas, excluindo mês1 e mês2
2.Se você deseja incluir um dos meses
3.Se você deseja incluir os dois meses
fonte
numberOfMonths=(year2-year1)*12+(month2-month1)+1;
o que faz o mesmo, mas é mais semanticamente correto para mimAqui está uma função que fornece com precisão o número de meses entre duas datas.
O comportamento padrão conta apenas meses inteiros, por exemplo, 3 meses e 1 dia resultará em uma diferença de 3 meses. Você pode evitar isso definindo o
roundUpFractionalMonths
parâmetro comotrue
, portanto, uma diferença de 3 meses e 1 dia será retornada como 4 meses.A resposta aceita acima (resposta de TJ Crowder) não é precisa, às vezes retorna valores errados.
Por exemplo,
monthDiff(new Date('Jul 01, 2015'), new Date('Aug 05, 2015'))
retornos0
que estão obviamente errados. A diferença correta é de 1 mês inteiro ou 2 meses arredondados.Aqui está a função que escrevi:
fonte
Se você precisar contar meses inteiros, independentemente do mês ser 28, 29, 30 ou 31 dias. Abaixo deve funcionar.
Esta é uma versão estendida da resposta https://stackoverflow.com/a/4312956/1987208, mas corrige o caso em que calcula 1 mês para o caso de 31 de janeiro a 1º de fevereiro (1 dia).
Isso cobrirá o seguinte;
fonte
Diferença de meses entre duas datas no JavaScript:
total de meses entre a data inicial e a data final:
fonte
Eu sei que isso é muito tarde, mas postá-lo de qualquer maneira, apenas no caso de ajudar os outros. Aqui está uma função que eu criei que parece fazer um bom trabalho em contar diferenças em meses entre duas datas. É reconhecidamente muito mais atrevido que o de Mr.Crowder, mas fornece resultados mais precisos ao percorrer o objeto de data. Está no AS3, mas você deve ser capaz de abandonar a digitação forte e terá JS. Sinta-se livre para torná-lo melhor procurando alguém lá fora!
fonte
Para expandir a resposta de @ TJ, se você estiver procurando meses simples, em vez de meses completos, basta verificar se a data de d2 é maior ou igual a d1. Ou seja, se d2 estiver no final do mês e d1 no mês, haverá mais 1 mês. Portanto, você deve conseguir fazer isso:
Isso não explica totalmente os problemas de horário (por exemplo, 3 de março às 16:00 e 3 de abril às 15:00), mas é mais preciso e apenas para algumas linhas de código.
fonte
Considere cada data em termos de meses e subtraia para encontrar a diferença.
Isso fará a diferença de meses entre as duas datas, ignorando os dias.
fonte
Existem duas abordagens: matemática e rápida, mas sujeitas a caprichos no calendário, ou iterativas e lentas, mas lida com todas as esquisitices (ou pelo menos os delegados as tratam em uma biblioteca bem testada).
Se você percorrer o calendário, aumentando a data de início em um mês e ver se passamos a data de término. Isso delega o tratamento de anomalias para as classes internas Date (), mas pode ser lento se você estiver fazendo isso por um grande número de datas. A resposta de James adota essa abordagem. Por mais que eu não goste da ideia, acho que essa é a abordagem "mais segura" e, se você estiver fazendo apenas um cálculo, a diferença de desempenho é realmente insignificante. Tendemos a otimizar demais as tarefas que serão executadas apenas uma vez.
Agora, se você estiver calculando essa função em um conjunto de dados, provavelmente não deseja executar essa função em cada linha (ou seja, Deus não permita, várias vezes por registro). Nesse caso, você pode usar quase qualquer uma das outras respostas aqui, exceto a resposta aceita, que está errada (diferença entre
new Date()
enew Date()
é -1)?Aqui está minha abordagem de uma abordagem matemática e rápida, responsável por diferentes comprimentos de meses e anos bissextos. Você realmente só deve usar uma função como essa se aplicá-la a um conjunto de dados (fazendo esse cálculo repetidamente). Se você precisar fazer isso apenas uma vez, use a abordagem iterativa de James acima, pois você está delegando o tratamento de todas as (muitas) exceções ao objeto Date ().
fonte
Aqui você segue outra abordagem com menos loop:
fonte
Você também pode considerar esta solução, isso
function
retorna a diferença do mês em número inteiro ou númeroPassar a data de início como a primeira ou a última
param
é tolerante a falhas. Ou seja, a função ainda retornaria o mesmo valor.fonte
Calcular a diferença entre duas datas incluem fração do mês (dias).
fonte
Isso deve funcionar bem:
fonte
fonte
O código a seguir retorna meses completos entre duas datas, levando em consideração o número de dias dos meses parciais.
fonte
}
fonte
abaixo da lógica buscará diferença em meses
fonte
fonte
Veja o que eu uso:
fonte
fonte
Número de meses em que o dia e a hora não importam
Nesse caso, não estou preocupado com meses inteiros, meses parciais, quanto tempo dura um mês etc. Eu só preciso saber o número de meses. Um caso relevante do mundo real seria onde um relatório deve ser entregue todos os meses, e eu preciso saber quantos relatórios devem existir.
Exemplo:
Este é um exemplo de código elaborado para mostrar para onde os números estão indo.
Vamos usar 2 carimbos de data e hora que devem resultar em 4 meses
Pode ser um pouco diferente com o fuso horário / horário estipulado. O dia, minutos e segundos não importam e podem ser incluídos no carimbo de data / hora, mas o desconsideraremos com nosso cálculo real.
Etapa 1: converter o carimbo de data e hora em uma data JavaScript
Etapa 2: obter valores inteiros para os meses / anos
Isso nos dá
Etapa 3: adicione
(12 * (endYear - startYear)) + 1
ao mês final.2 + (12 * (2020 - 2019)) + 1 = 15
Etapa 4: subtrair os meses
15 - 11 = 4
; nós obtemos nosso resultado de 4 meses.Exemplo de 29 meses
De novembro de 2019 a março de 2022, são 29 meses. Se você as colocar em uma planilha do Excel, verá 29 linhas.
3 + (12 * (2022-2019)) + 1
40 - 11 = 29
fonte
fonte
Uma abordagem seria escrever um Java Web Service simples (REST / JSON) que usa a biblioteca JODA
http://joda-time.sourceforge.net/faq.html#datediff
para calcular a diferença entre duas datas e chamar esse serviço em javascript.
Isso pressupõe que seu back-end esteja em Java.
fonte