Saltar al contenido

Diferencia en meses entre dos fechas en JavaScript

Solución:

La definición de “el número de meses de diferencia” está sujeta a muchas interpretaciones. 🙂

Puede obtener el año, el mes y el día del mes 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, improvisado:

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

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

function test(d1, d2) {
    var diff = monthDiff(d1, d2);
    console.log(
        d1.toISOString().substring(0, 10),
        "to",
        d2.toISOString().substring(0, 10),
        ":",
        diff
    );
}

test(
    new Date(2008, 10, 4), // November 4th, 2008
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 16

test(
    new Date(2010, 0, 1),  // January 1st, 2010
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 2

test(
    new Date(2010, 1, 1),  // February 1st, 2010
    new Date(2010, 2, 12)  // March 12th, 2010
);
// Result: 1

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

Incluir meses fraccionarios en lo anterior es mucho más complicado, porque tres días en un febrero típico es una fracción más grande de ese mes (~ 10,714%) que tres días en agosto (~ 9,677%) y, por supuesto, incluso febrero es un objetivo en movimiento. dependiendo de si es un 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 + 1 en lo anterior, aquí:

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

Eso es porque originalmente dije:

… esto averigua cuántos meses completos se encuentran 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. Sin contar los meses parciales, resulta que no es lo que muchas (¿la mayoría?) De las personas que vienen a la respuesta quieren, así que pensé que debería separarlas.

  2. No siempre funcionó, incluso según esa definición. 😀 (Lo siento.)

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

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

Tenga en cuenta que el índice mensual se basa en 0. Esto significa que January = 0 y December = 11.

A veces, es posible que desee obtener solo la cantidad de meses entre dos fechas, ignorando por completo la parte del día. Entonces, por ejemplo, si tenía dos fechas, 2013/06/21 y 2013/10/18, y solo le importaban las partes 2013/06 y 2013/10, estos son los escenarios y las posibles soluciones:

var date1=new Date(2013,5,21);//Remember, months are 0 based in JS
var date2=new Date(2013,9,18);
var year1=date1.getFullYear();
var year2=date2.getFullYear();
var month1=date1.getMonth();
var month2=date2.getMonth();
if(month1===0){ //Have to take into account
  month1++;
  month2++;
}
var numberOfMonths; 

1.Si desea solo el número de meses entre las dos fechas, excluyendo el mes 1 y el mes 2

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) - 1;

2.Si desea incluir alguno de los meses

numberOfMonths = (year2 - year1) * 12 + (month2 - month1);

3.Si desea incluir ambos meses

numberOfMonths = (year2 - year1) * 12 + (month2 - month1) + 1;
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *