Foros del Web » Programando para Internet » Javascript »

Trabado tontamente con Date()

Estas en el tema de Trabado tontamente con Date() en el foro de Javascript en Foros del Web. Buenas... Supongo que serán las horas, pero tengo una duda con la siguiente función. Al pasarle como fecha el "29/02/2004" me devuelve "Lunes, 29 de ...
  #1 (permalink)  
Antiguo 05/04/2007, 19:54
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Trabado tontamente con Date()

Buenas...

Supongo que serán las horas, pero tengo una duda con la siguiente función. Al pasarle como fecha el "29/02/2004" me devuelve "Lunes, 29 de Febrero del 2004" mientras que el toString() dice "Mon Mar 01 2004" (1 de marzo!)...

A ver si me pueden guiar un poco, pues la fecha debería ser "Domingo, 29 de Febrero del 2004"

Código:
function getCadenaFecha( cadena )
{

cadena = "29/02/2004";

	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" );


	var dia = parseInt(cadena.substr(0,2), 10);
	var mes = parseInt(cadena.substr(3,2), 10);
	var ano = parseInt(cadena.substr(6,4), 10);

	//alert( dia + "-" + mes + "-" + ano );
	
	objFecha = new Date();
	objFecha.setDate( dia );
	objFecha.setMonth( mes - 1 );
	objFecha.setFullYear( ano );
	objFecha.setHours(0);
	objFecha.setMinutes(0);
	objFecha.setSeconds(0);
	objFecha.setMilliseconds(0);

	alert( objFecha.toString() );

	return aDias[ objFecha.getDay() ] + ", " + dia + " de " + aMeses[ mes - 1 ] + " del " + ano;
	

}
  #2 (permalink)  
Antiguo 05/04/2007, 20:54
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 20 años, 6 meses
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,dia0,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 aDiasobjFecha.getDay() ] + ", " objFecha.getDate() + " de " aMesesobjFecha.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 
getCadenaFechacadena ) {
    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,dia0,0,0);
    var 
enStringobjFecha.toString();
    var 
enTxtaDiasobjFecha.getDay() ] + ", " dia " de " aMesesmes ] + " del " ano;
    return [
enString,enTxt];
}

alertgetCadenaFecha("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 
getCadenaFechacadena ) {
    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,dia0,0,0);
    var 
enStringobjFecha.toString();
    var 
enTxtaDiasobjFecha.getDay() ] + ", " objFecha.getDate() + " de " aMesesobjFecha.getMonth() ] + " del " objFecha.getFullYear();;
    return [
enString,enTxt];
}

alertgetCadenaFecha("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.
  #3 (permalink)  
Antiguo 06/04/2007, 01:29
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Re: Trabado tontamente con Date()

Hola:

Un mensaje antiguo: Fecha + Hora

toString(), es solo para presentar los datos y normalmente debe omitirse...
(creo que las 2 veces que he visto que se ha usado en este mensaje pueden omitirse)

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #4 (permalink)  
Antiguo 06/04/2007, 01:48
 
Fecha de Ingreso: abril-2002
Mensajes: 1.014
Antigüedad: 22 años
Puntos: 8
Re: Trabado tontamente con Date()

Ya sabía yo que tenía que ser algo tonto tonto, muchísimas gracias !
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 04:08.