Foros del Web » Programando para Internet » Javascript »

Restar horas

Estas en el tema de Restar horas en el foro de Javascript en Foros del Web. ¿Qué es lo que falla? Código HTML: <body onLoad= "sacarTiempo();" > <script> function sacarTiempo() { window.setTimeout( "sacarTiempo()", 1000); var fechaxd = new Date(); var fechaInicio ...
  #1 (permalink)  
Antiguo 26/06/2008, 06:50
 
Fecha de Ingreso: abril-2007
Mensajes: 213
Antigüedad: 17 años
Puntos: 0
Restar horas

¿Qué es lo que falla?

Código HTML:
<body onLoad="sacarTiempo();">
<script>
function sacarTiempo() {
window.setTimeout( "sacarTiempo()", 1000); 
var fechaxd = new Date();
var fechaInicio = new Date(fechaxd.getYear(),fechaxd.getMonth()+1,fechaxd.getDate(),fechaxd.getHours(),fechaxd.getMinutes(),fechaxd.getSeconds());
var fechaFin = new Date(2008,7,2,11,5,0);
	var diferencia = fechaFin.getTime() - fechaInicio.getTime();
	var dias = Math.round(diferencia / (1000 * 60 * 60 * 24));
	var dias2 = Math.abs(Math.round(diferencia / (1000 * 60 * 60 * 24)));
	var horas = Math.abs(((dias * 24) - (Math.round(diferencia / (1000 * 60 * 60)))));
	var horas2 = ((dias * 24) - (Math.round(diferencia / (1000 * 60 * 60))));
	var minutos = Math.abs((horas2 * 60) - ((dias * 24 * 60) - (Math.round(diferencia / (1000 * 60)))));
	var minutos2 = (horas2 * 60) - ((dias * 24 * 60) - (Math.round(diferencia / (1000 * 60))));
	var segundos = Math.round(diferencia / (1000)) - ((dias2 * 60 * 60 * 24) + (horas * 60 * 60) + (minutos2 * 60));
	document.getElementById('eltiempo').innerHTML=+dias2+"dias, "+horas+"horas, "+minutos+"minutos, "+segundos+"segundos.";
}

</script>
<div id="eltiempo"></div>
</body> 
Todo bien, menos los segundos, ¿Como debo ponerlos?
P.D.: Por favor, no me remitais a un código ya hecho, no quiero copiarlo.

Gracias
  #2 (permalink)  
Antiguo 26/06/2008, 08: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
Respuesta: Restar horas

Hola carlosgs91:

Creo que lo que estás buscando sería mas o menos así:

Código PHP:
<body onLoad="sacarTiempo();">
<
script>


function 
sacarTiempo() {
    
window.setTimeout"sacarTiempo()"1000); 
    var 
fechaInicio = new Date(); 
    
fechaInicio.setMonthfechaInicio.getMonth()+);
    var 
fechaFin = new Date(2008,7,211,5,0);
    var 
diferencia Math.absfechaFin.getTime() - fechaInicio.getTime() );
    var 
dias Math.floordiferencia /1000/60/60/24 );
    var 
horas Math.floordiferencia /1000/60/60) - dias*24;
    var 
minutos Math.floordiferencia /1000/60) - dias*24*60 horas*60;
    var 
segundos Math.floordiferencia /1000) - dias*24*60*60 horas*60*60 minutos*60;
    
document.getElementById('eltiempo').innerHTML "Desde el "+fechaInicio+"<br/>Hasta "+fechaFin+": <br/>"+dias+"dias, "+horas+"horas, "+minutos+"minutos, "+segundos+"segundos.";
}

</script>
<div id="eltiempo"></div> 
Es bueno simplificar en paréntesis y en longitud de sentencias para maximizar la legibilidad y mantenibilidad del código.

Por otra parte, estabas restando cantidades grandes a cantidades pequeñas (orden de sumandos), y en cada operación tenías que hacer un Math.abs() porque te salía negativo. También hay que señalar que aquí hay que utilizar un redondeo a la baja (Math.floor()) en vez de Math.round(), porque si faltan 7.98 días faltarán 7días+23.52 horas, y no 8días+23.52horas.

No sé qué decirte que fallaba en tu función, creo que sobraban variables por todas partes (ya que dias=dias2, minutos=minutos2...)



Por último no has posteado lo que quieres hacer, que es importante: Estás calculando la distancia entre la fecha actual + 1 mes (me he tomado la libertad de reescribirlo para que se entienda mejor), y el 2 de Agosto de 2008 a las 11:05h; espero que ese sea tu propósito.


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 26/06/2008, 09:33
 
Fecha de Ingreso: abril-2007
Mensajes: 213
Antigüedad: 17 años
Puntos: 0
Respuesta: Restar horas

Gracias, funciona perfectamente, supongo que sería eso, el error del Math.round en lugar de usar el Math.floor y luego que faltaba algún Math.abs().
  #4 (permalink)  
Antiguo 26/06/2008, 09:37
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
Respuesta: Restar horas

De nada


Hasta otra.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 26/06/2008, 09:43
 
Fecha de Ingreso: abril-2007
Mensajes: 213
Antigüedad: 17 años
Puntos: 0
Respuesta: Restar horas

Por cierto, para hacer que cuando llegue el día o cuando pase salga un mensaje, puedo hacer esto?:

Quitar el Math.abs y si el dia o la hora o el minuto o los segundos dan negativo que salte el mensaje de que ya llego y si no que cuente? Algo así sería, me funciona pero como a veces con el otro código salian numeros negativo según la hora...

Código HTML:
<body onLoad="sacarTiempo();"> 
<script> 


function sacarTiempo() { 
    window.setTimeout( "sacarTiempo()", 1000);  
    var fechaInicio = new Date();  
    var fechaFin = new Date(2008,6,2, 11,5,0); 
    var diferencia =fechaFin.getTime() - fechaInicio.getTime(); 
    var dias = Math.floor( diferencia /1000/60/60/24 ); 
    var horas = Math.floor( diferencia /1000/60/60) - dias*24; 
    var minutos = Math.floor( diferencia /1000/60) - dias*24*60 - horas*60; 
    var segundos = Math.floor( diferencia /1000) - dias*24*60*60 - horas*60*60 - minutos*60; 
	if(dias < 0) {    document.getElementById('eltiempo').innerHTML = "Ya ha llegado!"; }
	else {
	if(horas < 0) { document.getElementById('eltiempo').innerHTML = "Ya ha llegado!"; }
	else {
		if(minutos < 0) { document.getElementById('eltiempo').innerHTML = "Ya ha llegado!"; } else {
		if(segundos < 0) { document.getElementById('eltiempo').innerHTML = "Ya ha llegado!"; }
    else {
	document.getElementById('eltiempo').innerHTML = "Desde el "+fechaInicio+"<br/>Hasta "+fechaFin+": <br/>"+dias+"dias, "+horas+"horas, "+minutos+"minutos, "+segundos+"segundos."; 
	}
}
}

} }

</script> 
<div id="eltiempo"></div> 

Última edición por carlosgs91; 26/06/2008 a las 09:48
  #6 (permalink)  
Antiguo 26/06/2008, 19:42
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
Respuesta: Restar horas

Hola de nuevo:

Creo que tenemos que simplificarlo un poco: Puedes quitar el Math.abs() de diferencia y mirar a ver si diferencia es negativo. Tal y como esta puesto cuando sea negativo será mayor fechaInicio que fechaFin.

También se pueden comparar fechas directamente como si fueran números dentro de un condicional, y ahorrarte todo ese perifollo.

Con un if-else único en este caso bastaría. Sospecha de la lógica del código cuando escribes la misma instrucción dos veces.


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

Última edición por derkenuke; 26/06/2008 a las 19:43 Razón: Ortografía
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 13:30.