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>