Foros del Web » Programando para Internet » Javascript »

dateUtils, opiniones y mejoras

Estas en el tema de dateUtils, opiniones y mejoras en el foro de Javascript en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 13/07/2011, 08:31
 
Fecha de Ingreso: febrero-2005
Mensajes: 198
Antigüedad: 19 años, 2 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> 
  #2 (permalink)  
Antiguo 13/07/2011, 08:45
Avatar de Aijoona
Colaborador
 
Fecha de Ingreso: mayo-2011
Ubicación: Buenos Aires
Mensajes: 779
Antigüedad: 13 años
Puntos: 343
Respuesta: dateUtils, opiniones y mejoras

1. Escribir el código en ingles? :p

2. La declaración inicial de dateUtils es innecesaria, ya que lo estás sobrescribiendo abajo.

3. Te diría que la presentación sea código fuente por un lado, ejemplos por otro y test suite por otro.
__________________
blog | @aijoona
  #3 (permalink)  
Antiguo 14/07/2011, 01:56
 
Fecha de Ingreso: febrero-2005
Mensajes: 198
Antigüedad: 19 años, 2 meses
Puntos: 5
Respuesta: dateUtils, opiniones y mejoras

1. Como todo va a gustos. El lenguaje español es mucho más rico para expresarse, el inglés es más directo; pero también más ambiguo.

2. Pozi.

3. No lo he separado simplemente por comodidad vuestra; para que simplemente copiándolo en un archivo html podáis hacer pruebas.


¿algún método práctico más para añadir?
¿algún método con errores?

Etiquetas: html, js, mejoras, opiniones
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:56.