Diferencia en meses entre dos fechas en JavaScript

Resuelto William Troup asked hace 14 años • 29 respuestas

¿Cómo calcularía la diferencia para dos objetos Date() en JavaScript y solo devolvería el número de meses de la diferencia?

Cualquier ayuda sería genial :)

William Troup avatar Mar 29 '10 14:03 William Troup
Aceptado

La definición de "el número de meses de diferencia" está sujeta a muchas interpretaciones. :-)

Puede obtener el año, mes y día del mes a partir de un objeto de fecha de JavaScript. Dependiendo de la información que esté buscando, puede usarla para calcular cuántos meses hay entre dos puntos en el tiempo.

Por ejemplo, improvisadamente:

function monthDiff(d1, d2) {
    var months;
    months = (d2.getFullYear() - d1.getFullYear()) * 12;
    months -= d1.getMonth();
    months += d2.getMonth();
    return months <= 0 ? 0 : months;
}

Mostrar fragmento de código

(Tenga en cuenta que los valores de mes en JavaScript comienzan con 0 = enero).

Incluir fracciones de meses en lo anterior es mucho más complicado, porque tres días en un febrero típico es una fracción mayor de ese mes (~10,714%) que tres días en agosto (~9,677%), y por supuesto, incluso febrero es un objetivo móvil. dependiendo de si es año bisiesto.

También hay algunas bibliotecas de fecha y hora disponibles para JavaScript que probablemente faciliten este tipo de cosas.


Nota : Solía ​​​​haber un + 1en lo anterior, aquí:

months = (d2.getFullYear() - d1.getFullYear()) * 12;
months -= d1.getMonth() + 1;
// −−−−−−−−−−−−−−−−−−−−^^^^
months += d2.getMonth();

Eso es porque originalmente dije:

... esto descubre cuántos meses completos hay entre dos fechas, sin contar los meses parciales (por ejemplo, excluyendo el mes en el que se encuentra cada fecha).

Lo eliminé por dos razones:

  1. No contar los meses parciales resulta no ser lo que quieren muchas (¿la mayoría?) de las personas que llegan a la respuesta, así que pensé que debería separarlos.

  2. No siempre funcionó ni siquiera según esa definición. :-D (Lo siento.)

T.J. Crowder avatar Mar 29 '2010 07:03 T.J. Crowder

Si no considera el día del mes, esta es, con diferencia, la solución más sencilla.

function monthDiff(dateFrom, dateTo) {
 return dateTo.getMonth() - dateFrom.getMonth() + 
   (12 * (dateTo.getFullYear() - dateFrom.getFullYear()))
}


//examples
console.log(monthDiff(new Date(2000, 01), new Date(2000, 02))) // 1
console.log(monthDiff(new Date(1999, 02), new Date(2000, 02))) // 12 full year
console.log(monthDiff(new Date(2009, 11), new Date(2010, 0))) // 1
Expandir fragmento

Tenga en cuenta que el índice mensual está basado en 0. Esto significa que January = 0y December = 11.

Tom Gullen avatar Nov 30 '2010 10:11 Tom Gullen