2010-11-30 11 views
10

¿Cómo calculo la diferencia en meses en Javascript?Javascript month difference

Tenga en cuenta que hay preguntas similares, tales como: What's the best way to calculate date difference in Javascript

Pero éstas se basan en la diferencia de MS, cuando algunos meses tienen diferente número de días que otros!

¿Alguna manera fácil de calcular la diferencia mensual entre 2 fechas?

Para que quede claro, lo que necesito saber cuántos meses abarcan las fechas, por ejemplo:

Jan 29th 2010, and Feb 1st 2010 = 2 months 
Jan 1st 2010, and Jan 2nd 2010 = 1 month 
Feb 14th 2010, Feb 1st 2011 = 13 months 
Feb 1st 2010, March 30th 2011 = 14 months 
+0

¿A qué se refieren exactamente por diferencia de mes? Todo el calendario meses, por ejemplo, 12 de abril de 2010 -> 16 de junio de 2010 = 1; o las longitudes de los meses tomadas desde la fecha de inicio, por ejemplo, 12 de abril de 2010 -> 16 de junio de 2010 = 2. ¿O también desea calcular la parte decimal? En ese caso. ¿Qué valor obtiene cada día? ¿Un mes en febrero obtiene 1/28 mientras que un mes en diciembre obtiene 1/31? Luego están los años bisiestos ... –

+0

http://stackoverflow.com/questions/2536379/difference-in-months-between-two-dates-in-javascript – ArK

+0

Lo siento, para que quede claro que es el total de # meses que abarca la fecha . –

Respuesta

19
DisplayTo.getMonth() - DisplayFrom.getMonth() + (12 * (DisplayTo.getFullYear() - DisplayFrom.getFullYear()))); 

getMonth menos getMonth le da la diferencia meses entre las fechas de dos meses.

Luego multiplicamos 12 por el número de años de diferencia y lo agregamos al resultado que nos da el período completo del mes.

+4

Nice one liner .. caso de prueba disponible aquí si alguien está interesado. http://jsfiddle.net/E5Bz3/1/ :) –

+1

Gran solución, busqué por todos lados para esto ... gracias .. – hminaya

+0

No funciona si, por ejemplo, StartDate = 12 de diciembre de 2012 y EndDate = 1 de enero de 2013. El resultado será 1, no 2. – Marina

5

[editar ] Sobre la base de comentario, mi error. Usando la respuesta aceptada que haría uso de somethng como:

var datefrom = new Date('2001/03/15') 
    ,dateto = new Date('2011/07/21') 
    ,nocando = datefrom<dateto ? null : 'datefrom > dateto!' 
    ,diffM = nocando || 
      dateto.getMonth() - datefrom.getMonth() 
       + (12 * (dateto.getFullYear() - datefrom.getFullYear())) 
    ,diffY = nocando || Math.floor(diffM/12) 
    ,diffD = dateto.getDate()-datefrom.getDate() 
    ,diffYM = nocando || 
       (diffY>0 ? ' Year(s) ' : '') 
       + diffM%12+' Month(s) '+(diffD>0? (diffD+' day(s)') : '') ; 

console.log(diffYM); //=> 10 Year(s) 4 Month(s) 6 day(s) 
+0

esto está mal si las 2 fechas son: fecha1 = nueva Fecha ('2011/1/04') , fecha2 = nueva Fecha ('2010/12/04') dará la respuesta incorrecta – ToDayIsNow

+0

Tiene toda la razón, mejor uso Gullens oneliner. Respuesta editada basada en eso. – KooiInc

3

He encontrado lo siguiente en la página web http://ditio.net/2010/05/02/javascript-date-difference-calculation/:

inMonths: function(d1, d2) { 
     var d1Y = d1.getFullYear(); 
     var d2Y = d2.getFullYear(); 
     var d1M = d1.getMonth(); 
     var d2M = d2.getMonth(); 

     return (d2M+12*d2Y)-(d1M+12*d1Y); 
    } 

En su caso, ya que desea incluir todos los meses en el lapso fecha, me acaba de modificar el código anterior mediante la adición de 1 a ella: return (d2M+12*d2Y)-(d1M+12*d1Y) + 1;

1
function calcualteMonthYr(){ 
    var fromDate =new Date($('#txtDurationFrom2').val()); // Date picker (text fields) 
    var toDate = new Date($('#txtDurationTo2').val()); 
    var months=0; 
     months = (toDate.getFullYear() - fromDate.getFullYear()) * 12; 
     months -= fromDate.getMonth(); 
     months += toDate.getMonth(); 
      if (toDate.getDate() < fromDate.getDate()){ 
       months--; 
      } 
    $('#txtTimePeriod2').val(months); // result 
} 
+0

Tal vez explique un poco su respuesta – Scorpio

Cuestiones relacionadas