Ver Mensaje Individual
  #1 (permalink)  
Antiguo 13/07/2011, 08:31
occiso
 
Fecha de Ingreso: febrero-2005
Mensajes: 198
Antigüedad: 19 años, 10 meses
Puntos: 5
dateUtils, opiniones y mejoras

Saludos compañeros,

He recopilado un par de métodos útiles para la gestión de fechas en javascript. Acepto sugerencias, críticas, mejoras, etc.

Sólo pegad el código que hay a continuacion en un archivo html.

Código PHP:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<
html>
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<
title>Insert title here</title>
<
script language="JavaScript" src ="idiomas.js"</script>
<script type="text/javascript">

//objeto con  metodos para tratar fechas en js.
var dateUtils = {};

/*** 
 * NOTA IMPORTANTE A TENER EN CUENTA CON EL OBJETO DATE:
 * javascript contabiliza los meses del [0..11] siendo el cero el mes de enero y el 11 el mes de diciembre
 ***/
 
//funcion autoejecutable usando el patron modulo revelado (fuente: http://www.etnassoft.com/2011/04/12/revealing-module-javascript)
dateUtils = ( function () {

    //VARIABLES Y METODOS PRIVADOS (no se definen en el return)    
    
    function obtenerEjercicio(pFecha, diaIniPeriodo, mesIniPeriodo){
         var anio = pFecha.getUTCFullYear();
         var fecPeriodo =  new Date (anio, mesIniPeriodo, diaIniPeriodo); //fecha inicio periodo.
         return (pFecha < fecPeriodo) ?  anio -1 : anio;
    }
    
    /**
     * Crea una fecha con la hora a cero 00:00:00
     * @param {} fecha Date     
     * @return Date 
     **/
    function generarFechaSinhora( fecha ){
        var dia = fecha.getDate();
        var mes = fecha.getMonth();
        var anio = fecha.getFullYear();
        
        return new Date( anio, mes, dia, 0, 0, 0 );        
    }
    
    //METODOS PUBLICOS (se definen en el return)
        
    function getCheckDate ( month, day, year) {              
       return month > 0 && month < 13 && year > 0 && year < 32768 && day > 0 && day <= (new Date(year, month, 0)).getDate();
    }
        
    /***
     * @param {} mes Number
     * @param {} anio Number
     * @return Number - Último día del mes
    ***/    
    function getUltimoDiaMes( mes,anio ){ 
       var ultimo_dia=28; 
       while (getCheckDate(mes+1,ultimo_dia + 1,anio)){ 
          ultimo_dia++; 
       } 
       return ultimo_dia; 
    }
        
    /***     
     * @return Date con la fecha 31/12/3000
     ***/    
    function getFechaNoCaduca(){
        return new Date(3000, 11, 31, 0, 0, 0);
    }
    
     /***
     * @param {} pFecIni Date
     * @param {} pFecFin Date
     * @param {} pDiaIniPeriodo Number
     * @param {} pMesIniPeriodo Number
     * @return boolean 
     ***/
    //Por defecto valida que las fechas se  encuentran entre entre el 1 de Nov de un año y el 31 de Octubre del siguiente          
    function estaDentroPeriodo( pFecIni, pFecFin,  pDiaIniPeriodo, pMesIniPeriodo ){    
         //Si no indican el dia y mes de inicio del período (undefined) por defecto indicamos el 1 de noviembre
         var diaIniPeriodo = pDiaIniPeriodo || 1;
         var mesIniPeriodo = pMesIniPeriodo || 10;    
         
         var ejercicioFecIni = obtenerEjercicio(pFecIni, diaIniPeriodo,mesIniPeriodo);
         var ejercicioFecFin = obtenerEjercicio(pFecFin, diaIniPeriodo,mesIniPeriodo);
    
         return (ejercicioFecIni == ejercicioFecFin)
    }
    
    /***
     * @param {} fecha Date
     * @param {} fecha2 Date
     * @return boolean 
     ***/
    function esMismoDia ( fecha,  fecha2 ){
    
        return  fecha.getDate() === fecha2.getDate()
                && fecha.getMonth() === fecha2.getMonth()
                && fecha.getFullYear() === fecha2.getFullYear()                 
    }
    
    /***
     * Incrementa el  número de dias. Si llega  al último dia del mes pasa al siguiente. (idem lenient en JAVA -clase calendar-)
     * el numero de  dias puede ser negativo y le resta.
     * @param {} fecha Date    
     * @param {} numDias Number    - Dias a incrementar
     * @return Date 
     ***/
    function incrementarNumDias ( fecha, numDias){
        var dia = fecha.getDate() + numDias;
        var mes = fecha.getMonth();
        var anio = fecha.getFullYear();
        
        return new Date (anio, mes, dia);
    }
    
    /***
     * Incrementa el  número de meses. Si llega  al último dia del mes pasa al siguiente. (idem lenient en JAVA -clase calendar-)
     * el numero de  dias puede ser negativo y le resta.
     * @param {} fecha Date    
     * @param {} numDias Number    - Dias a incrementar
     * @return Date 
     ***/
    function incrementarNumMeses ( fecha, numMeses){
        var dia = fecha.getDate();
        var mes = fecha.getMonth()  + numMeses;
        var anio = fecha.getFullYear();
        
        return new Date (anio, mes, dia);
    }
    
    /** el objeto Date soporta estos formatos de fecha como string
     *    "MM-dd-yyyy"
     *  "yyyy/MM/dd"
     *  "MM/dd/yyyy"
     *  "MMMM dd, yyyy"
     *  "MMM dd, yyyy"
     *    Para un formato de fecha dd/mm/aaaa utilizar el siguiente metodo
     *  @param {} stringDate string fecha con formato dd/mm/aaaa    
     *  @param {} character string  caracter que separa los dias, meses y años. Por defecto indicamos el slash ("/")
     *  @return Date
     **/
        
    function stringToDate( stringDate, character ){    
        character = character || '/';
        var arrayFecha = stringDate.split(character);
        
        var dia = parseInt(arrayFecha[0], 10);
        var mes = parseInt(arrayFecha[1], 10) - 1;  //ajuste mes 
        var anio = parseInt(arrayFecha[2], 10);
        
        return new Date( anio, mes, dia , 0, 0, 0 );
    }
    
    /***
     * Indica si fecha > fecha2. No tiene en cuenta la hora.
     * @param {} fecha Date    
     * @param {} fecha2 date
     * @return boolean 
     ***/
    function esMayor( fecha, fecha2 ){        
        var fecIni = generarFechaSinhora( fecha );
        var fecFin = generarFechaSinhora( fecha2 );
                
        return  fecIni.getTime() > fecFin.getTime(); 
    }
    
    /***
     * @param {} fecha Date    -La fecha mayor-
     * @param {} fecha2 date - La fecha menor-
     * @return Number - Cantidad de dias transcurridos entre dos fechas 
     ***/
    function totalDiasTranscurridos (fechaMayor, fechaMenor){
        var fecMayor = generarFechaSinhora( fechaMayor );
        var fecMenor = generarFechaSinhora( fechaMenor );
        
        return Math.floor( (fecMayor.getTime() - fecMenor.getTime()) / ( 1000 * 60 * 60 * 24 ));
    }
    
    
    //METODOS PUBLICOS (API)
    return {
        getCheckDate: getCheckDate,                      //función para comprobar si el dia mes y año  pertececen a una fecha correcta
        getUltimoDiaMes: getUltimoDiaMes,                //funcion que devuelve el último día de un mes y año dados    
        getFechaNoCaduca: getFechaNoCaduca,             //Devuelve la fecha del 31/12/3000    
        estaDentroPeriodo: estaDentroPeriodo,             //Valida que dos fechas se encuentran dentro de un período interanual
        esMismoDia: esMismoDia,                            //Comprueba si dos fechas dadas son la misma sin tener en cuenta la hora
        incrementarNumDias: incrementarNumDias,         //Dada una fecha le incrementa el  número de  días indicado
        incrementarNumMeses: incrementarNumMeses,        //Dada una fecha le incrementa el  número de  meses indicado
        stringToDate: stringToDate,                        //convierte cadena con formato dd/mm/aaaa a fecha
        esMayor: esMayor,                                //Indica si una fecha es mayor que otra
        totalDiasTranscurridos: totalDiasTranscurridos    //Calcula los dias transcurridos entre dos fechas
    }
    
}() );


function miFuncion(){
    console.log ( dateUtils.getUltimoDiaMes( 1, 2001) );
    /*console.log ( dateUtils.getFechaNoCaduca() );
    
    fec  = new Date(2011,2,1);
    fec2 = new Date(2011,3,12);*/
    
    
    
    /*if (dateUtils.esMayor( fec, fec2 ) ){
        console.log ( "fec > fec2" );
    } else {
        console.log ( "fec <= fec2" );
    }
    
    console.log(dateUtils.totalDiasTranscurridos( fec2, fec ));
    
    if ( dateUtils.esMismoDia( fec, fec2 ) ){
        console.log ( "es el mismo dia" );
    } else {
        console.log ( "NO es el mismo dia" );
    }*/
    
    /*var fechaStringToDate = dateUtils.stringToDate( '12-08-2001', '-' );
    console.log( dateUtils.stringToDate( '12-08-2001', '-' ) );
    console.log( dateUtils.stringToDate( '13/08/2001') );
    console.log( dateUtils.incrementarNumDias( fec, 100 ) );
    console.log( dateUtils.incrementarNumMeses( fec, 2 ) );*/
    
    
    
}



</script>
</head>
<body onLoad="miFuncion()">

</body>
</html>