InicioOfftopicJavascript, diferencia en dias, meses y/o años entre fechas

Javascript, diferencia en dias, meses y/o años entre fechas

Offtopic7/25/2013
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]
Datos archivados del Taringa! original
20puntos
1,134visitas
0comentarios
Actividad nueva en Posteamelo
0puntos
2visitas
0comentarios
Dar puntos:

Dejá tu comentario

0/2000

Autor del Post

p
phpjs🇦🇷
Usuario
Puntos0
Posts3
Ver perfil →
PosteameloArchivo Histórico de Taringa! (2004-2017). Preservando la inteligencia colectiva de la internet hispanohablante.

CONTACTO

18 de Septiembre 455, Casilla 52

Chillán, Región de Ñuble, Chile

Solo correo postal

© 2026 Posteamelo.com. No afiliado con Taringa! ni sus sucesores.

Contenido preservado con fines históricos y culturales.