A tono con la onda del pensé en dejarles esta otra función que a mi me sirvió un montón y es a prueba de balas, es decir, esta recontra probada en varios sistemas internos y webs de empresas que usan esto diariamente:
[color=#000000]/**
* Devuelve un objeto con atributos days, months, years (sólo si
* bIncludeYears es verdadero), from, until o falso si la fechas no
* son válidas
*
[email protected]
://www.globalinnovation.com.ar
[email protected]
[email protected]
echa desde
[email protected]
fecha hasta
[email protected]
[sFormato] El formato de las fechas. default: dd/mm/yyyy
[email protected]
[sSeparator] Separador opcional. default: /
[email protected]
[bIncludeYears] Calcula los años y los resta de los meses
[email protected]
[bDebug] Muestra por consola, en los navegadores que la soporten, datos de debug. Default: false
[email protected]
"days", "months", "years" (if bIncludeYears is true), "from" and "until" as attributes
*/
function dateDiff2(sFechaDesde, sFechaHasta, sFormato, sSeparator, bIncludeYears, bDebug)
{
bIncludeYears = (bIncludeYears ? true : false);
sSeparator = (sSeparator ? sSeparator : '/');
bDebug = ((bDebug ? true : false) ? (console ? true : false) : false);
var aFecha1, aFecha2, diff;
var oFormato = eval('({"dd": 0,"mm": 1,"yyyy": 2})');
if (bIncludeYears)
var oReturn = eval('({"days": 0, "months": 0, "years": 0, "from":"' + sFechaDesde + '", "until":"' + sFechaHasta + '"})');
else
var oReturn = eval('({"days": 0, "months": 0 , "from":"' + sFechaDesde + '", "until":"' + sFechaHasta + '"})');
// Formato
if (!sFormato)
{
sFormato = 'dd/mm/yyyy';
}
else
{
var aFormato = sFormato.split(sSeparator);
for(iPos in aFormato)
{
eval('oFormato.' + aFormato[iPos] + ' = ' + String(iPos));
iPos++;
}
}
if (bDebug) console.log('Formato: ' + sFormato, aFormato, oFormato);
// Validez
if (!ValidarFecha(sFechaHasta, sFormato) ||
!ValidarFecha(sFechaDesde, sFormato))
{
if (bDebug) console.log('Fecha(s) no válida(s): ' + sFechaHasta + ' al ' + sFechaDesde);
return false;
}
// Date validity
var aFechaDesde = sFechaDesde.split('/');
var iDesdeDD = parseInt(aFechaDesde[oFormato.dd ], 10);
var iDesdeMM = parseInt(aFechaDesde[oFormato.mm ], 10);
var iDesdeYY = parseInt(aFechaDesde[oFormato.yyyy], 10);
if (bDebug) console.log('Fecha Desde - Array - DD MM YYYY: ', aFechaDesde, iDesdeDD, iDesdeMM, iDesdeYY);
var aFechaHasta = sFechaHasta.split('/');
var iHastaDD = parseInt(aFechaHasta[oFormato.dd ], 10);
var iHastaMM = parseInt(aFechaHasta[oFormato.mm ], 10);
var iHastaYY = parseInt(aFechaHasta[oFormato.yyyy], 10);
if (bDebug) console.log('Fecha Hasta - Array - DD MM YYYY: ', aFechaHasta, iHastaDD, iHastaMM, iHastaYY);
// mismo año y mes
if (iDesdeYY == iHastaYY && iDesdeMM == iHastaMM)
{
oReturn.months = 0;
if (bDebug) console.log('mismo año y mismo mes');
}
// mismo año y distinto mes
else if (iDesdeYY == iHastaYY && iDesdeMM != iHastaMM)
{
oReturn.months = (iHastaMM - iDesdeMM);
if (bDebug) console.log('mismo año y distinto mes');
}
// distinto año
else
{
// Meses de diferencia por años
oReturn.months = ((iHastaYY - iDesdeYY) * 12);
// Meses de diferencia en el año coincidente
if (iHastaMM > iDesdeMM)
oReturn.months += (iHastaMM - iDesdeMM);
else
oReturn.months += (iHastaMM + (12 - iDesdeMM) - 12);
if (bDebug) console.log('distinto año');
}
// Años
if (bIncludeYears)
{
if (bDebug) console.log('Calcula los años');
oReturn.years = Math.floor(oReturn.months / 12);
oReturn.months -= oReturn.years * 12;
}
// Dias de diferencia
// hasta es mayor o igual
if (iHastaDD >= iDesdeDD)
{
oReturn.days = iHastaDD - iDesdeDD;
if (bDebug) console.log('Dias de diferencia -> Dia hasta es mayor o igual');
}
// hasta es menor
else
{
if (oReturn.months) oReturn.months--;
var dd = new Date(iHastaYY, (iHastaMM - 1), 0); // El mes empieza en 0
var iDiasMesAnterior = dd.getDate();
oReturn.days = iHastaDD + iDiasMesAnterior - iDesdeDD;
if (bDebug) console.log('iHastaDD + iDiasMesAnterior - iDesdeDD: ', iHastaDD, iDiasMesAnterior, iDesdeDD);
if (bDebug) console.log('Dias de diferencia -> Dia hasta es menor, se restan meses');
}
if (bDebug) console.log('Se retorna: ', oReturn);
return oReturn;
}
[/color]