Ver Mensaje Individual
  #2 (permalink)  
Antiguo 05/04/2007, 20:54
Avatar de derkenuke
derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 23 años
Puntos: 45
Re: Trabado tontamente con Date()

Juas qué gracioso:

Verás, como nos encontramos en 2007 (año no bisiesto), al hacer
objFecha = new Date();
Estás creando ya la fecha con el día y la hora del momento de ejecución de la página (momento ahora).
Después haces
objFecha.setDate( dia );
objFecha.setMonth( mes - 1 );

Con lo cual el día es fijado a 29 y el mes a febrero, pero 29 de Febrero no existe en 2007, luego su día equivalente es 1 de marzo de 2007.
Y después cambias el año:
objFecha.setFullYear( ano );
Entonces queda cambiada la fecha a 1 de marzo de 2004.


Solución: Pongamos el año antes del mes. O eso o hacer una cosa más simple:
Código PHP:
//Date(año,mes,dia,hora,minutos,segundos) 
objFecha = new Date(ano,mes-1,dia, 0,0,0); 
Y entonces funcionará de cualquier manera.


Y el problema de que la función te devuelva "Lunes, 29 de Febrero del 2004", y el método toString() "Mon Mar 01 2004" no es contradictorio porque para generar la primera cadena estas utilizando las variables dia mes y ano, y no las variables de objFecha:
Código PHP:
    return aDias[ objFecha.getDay() ] + ", " + objFecha.getDate() + " de " + aMeses[ objFecha.getMonth() ] + " del " + objFecha.getFullYear(); 
De esta manera coincidirán el return y el toString(), sea la fecha esperada o no.

Con tu función:
Código PHP:
var aDias  = new Array( "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" );
var 
aMeses = new Array( "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" );
function 
getCadenaFecha( cadena ) {
    var 
dia = parseInt(cadena.substr(0,2), 10);
    var 
mes = parseInt(cadena.substr(3,2), 10);
    var 
ano = parseInt(cadena.substr(6,4), 10);
    var 
objFecha = new Date(ano,mes-1,dia, 0,0,0);
    var 
enString= objFecha.toString();
    var 
enTxt= aDias[ objFecha.getDay() ] + ", " + dia + " de " + aMeses[ mes - 1 ] + " del " + ano;
    return [
enString,enTxt];
}

alert( getCadenaFecha("42/02/2004").join("\r") ); 
El día 42 de febrero se corrige en el toString (13 de marzo), pero no en el texto que devuelves tú, dándote una mezcla: sábado (bien) 42 (mal) de Febrero (mal) de 2004 (bien, pero por casualidad).

Solucionalo, pues, así:
Código PHP:
var aDias  = new Array( "Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado" );
var 
aMeses = new Array( "Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre" );
function 
getCadenaFecha( cadena ) {
    var 
dia = parseInt(cadena.substr(0,2), 10);
    var 
mes = parseInt(cadena.substr(3,2), 10);
    var 
ano = parseInt(cadena.substr(6,4), 10);
    var 
objFecha = new Date(ano,mes-1,dia, 0,0,0);
    var 
enString= objFecha.toString();
    var 
enTxt= aDias[ objFecha.getDay() ] + ", " + objFecha.getDate() + " de " + aMeses[ objFecha.getMonth() ] + " del " + objFecha.getFullYear();;
    return [
enString,enTxt];
}

alert( getCadenaFecha("42/02/2004").join("\r") ); 


Un saludo!!
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.