Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Calcular tiempo entre dos horas (HH:MM:SS)

Estas en el tema de Calcular tiempo entre dos horas (HH:MM:SS) en el foro de Javascript en Foros del Web. Hola buenas, teniendo dos horas con formato HH:MM:SS, de qué forma podría calcular la diferencia entre ellas? El problema llega cuando por ejemplo: Tenemos la ...
  #1 (permalink)  
Antiguo 12/02/2014, 20:27
 
Fecha de Ingreso: febrero-2013
Mensajes: 119
Antigüedad: 11 años, 9 meses
Puntos: 2
Calcular tiempo entre dos horas (HH:MM:SS)

Hola buenas,

teniendo dos horas con formato HH:MM:SS, de qué forma podría calcular la diferencia entre ellas?

El problema llega cuando por ejemplo:

Tenemos la hora 03:29:01 y tenemos otra hora 03:28:56.

Con una resta simple, obtendríamos como diferencia: 00:01:-55 y claramente es incorrecto...

Ideas? Gracias de antemano :/

PD: Pasándolo todo a segundos antes de la resta, y posteriormente devolver los segundos al formato, valdría? Gracias

Última edición por corei7; 12/02/2014 a las 20:34
  #2 (permalink)  
Antiguo 12/02/2014, 20:47
Avatar de TMeister
Crazy Coder
 
Fecha de Ingreso: enero-2002
Ubicación: En la Oficina
Mensajes: 2.880
Antigüedad: 22 años, 10 meses
Puntos: 193
Respuesta: Calcular tiempo entre dos horas (HH:MM:SS)

Tiene que usar el objeto date

Código Javascript:
Ver original
  1. var a = new Date("February 12, 2014 03:29:01");
  2. var b = new Date("February 12, 2014 03:28:56");
  3. //La diferencia se da en milisegundos así que debes dividir entre 1000
  4. var c = ((a-b)/1000);
  5. console.log( c ) // resultado 5;
  #3 (permalink)  
Antiguo 12/02/2014, 20:54
 
Fecha de Ingreso: febrero-2013
Mensajes: 119
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Calcular tiempo entre dos horas (HH:MM:SS)

Cita:
Iniciado por TMeister Ver Mensaje
Tiene que usar el objeto date

Código Javascript:
Ver original
  1. var a = new Date("February 12, 2014 03:29:01");
  2. var b = new Date("February 12, 2014 03:28:56");
  3. //La diferencia se da en milisegundos así que debes dividir entre 1000
  4. var c = ((a-b)/1000);
  5. console.log( c ) // resultado 5;
Sería posible hacerlo únicamente con el formato HH:MM:SS? Gracias ;)
  #4 (permalink)  
Antiguo 12/02/2014, 21:09
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Calcular tiempo entre dos horas (HH:MM:SS)

Claro que se puede:

Código Javascript:
Ver original
  1. var hora1 = ("04:29:01").split(":"),
  2.     hora2 = ("03:28:56").split(":"),
  3.     t1 = new Date(),
  4.     t2 = new Date();
  5.  
  6. t1.setHours(hora1[0], hora1[1], hora1[2]);
  7. t2.setHours(hora2[0], hora2[1], hora2[2]);
  8.  
  9. //Aquí hago la resta
  10. t1.setHours(t1.getHours() - t2.getHours(), t1.getMinutes() - t2.getMinutes(), t1.getSeconds() - t2.getSeconds());
  11.  
  12. //Imprimo el resultado
  13. document.body.innerHTML = "La diferencia es de: " + (t1.getHours() ? t1.getHours() + (t1.getHours() > 1 ? " horas" : " hora") : "") + (t1.getMinutes() ? ", " + t1.getMinutes() + (t1.getMinutes() > 1 ? " minutos" : " minuto") : "") + (t1.getSeconds() ? (t1.getHours() || t1.getMinutes() ? " y " : "") + t1.getSeconds() + (t1.getSeconds() > 1 ? " segundos" : " segundo") : "");

El resultado es:

Código HTML:
Ver original
  1. La diferencia es de: 1 hora y 5 segundos

Con tus datos, el resultado sería: "La diferencia es de: 5 segundos".

Tenemos inicialmente 2 horas con el formato HH:MM:SS, a cada una la convierto en un array distinto, separando sus elementos desde el ":" que separa las horas de los minutos y segundos, además, creo dos objetos Date para manipular las horas.

A cada objeto Date, le asigno las horas, minutos y segundos que obtuve de cada una de las horas en cuestión, luego, asigno al primer objeto sus nuevos componentes de horas, minutos y segundos, que no son otros que la resta de las horas, minutos y segundos del primer objeto con el segundo. Finalmente, imprimo la diferencia.

Así es como se ve en ejecución: http://jsfiddle.net/pwYG8/

La línea de código de la impresión del resultado es un poco larga porque acomodo las palabras que se mostrarán según el valor de cada parte del objeto Date, para que cuando haya una hora, un minuto o un segundo en el resultado, se muestre de esa forma y no "1 segundos", por ejemplo.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 12/02/2014, 22:05
 
Fecha de Ingreso: febrero-2013
Mensajes: 119
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Calcular tiempo entre dos horas (HH:MM:SS)

Cita:
Iniciado por Alexis88 Ver Mensaje
Claro que se puede:

Código Javascript:
Ver original
  1. var hora1 = ("04:29:01").split(":"),
  2.     hora2 = ("03:28:56").split(":"),
  3.     t1 = new Date(),
  4.     t2 = new Date();
  5.  
  6. t1.setHours(hora1[0], hora1[1], hora1[2]);
  7. t2.setHours(hora2[0], hora2[1], hora2[2]);
  8.  
  9. //Aquí hago la resta
  10. t1.setHours(t1.getHours() - t2.getHours(), t1.getMinutes() - t2.getMinutes(), t1.getSeconds() - t2.getSeconds());
  11.  
  12. //Imprimo el resultado
  13. document.body.innerHTML = "La diferencia es de: " + (t1.getHours() ? t1.getHours() + (t1.getHours() > 1 ? " horas" : " hora") : "") + (t1.getMinutes() ? ", " + t1.getMinutes() + (t1.getMinutes() > 1 ? " minutos" : " minuto") : "") + (t1.getSeconds() ? (t1.getHours() || t1.getMinutes() ? " y " : "") + t1.getSeconds() + (t1.getSeconds() > 1 ? " segundos" : " segundo") : "");

El resultado es:

Código HTML:
Ver original
  1. La diferencia es de: 1 hora y 5 segundos

Con tus datos, el resultado sería: "La diferencia es de: 5 segundos".

Tenemos inicialmente 2 horas con el formato HH:MM:SS, a cada una la convierto en un array distinto, separando sus elementos desde el ":" que separa las horas de los minutos y segundos, además, creo dos objetos Date para manipular las horas.

A cada objeto Date, le asigno las horas, minutos y segundos que obtuve de cada una de las horas en cuestión, luego, asigno al primer objeto sus nuevos componentes de horas, minutos y segundos, que no son otros que la resta de las horas, minutos y segundos del primer objeto con el segundo. Finalmente, imprimo la diferencia.

Así es como se ve en ejecución: http://jsfiddle.net/pwYG8/

La línea de código de la impresión del resultado es un poco larga porque acomodo las palabras que se mostrarán según el valor de cada parte del objeto Date, para que cuando haya una hora, un minuto o un segundo en el resultado, se muestre de esa forma y no "1 segundos", por ejemplo.

Saludos
Muchas gracias Alexis, muy buena explicación, gracias por tu tiempo.

Sólo una pregunta, cuando usas la función new Date(), estás creando una variable de fecha, con formato completo. Si las dos Dates tienen un día distinto, la diferencia seguirá siendo sólo de la hora, o también de la fecha? Ej: 1 día y 30 segundos de diferencia...

Editado: No sé si me he explicado bien antes, me refiero a esto:

FECHA1: 13 Febrero, 23:59:59
FECHA2: 14 Febrero, 00:00:02

La diferencia sería de 3 segundos? O sería de 1 día y 3 segundos?

Gracias, un saludo!

Última edición por corei7; 12/02/2014 a las 22:21
  #6 (permalink)  
Antiguo 12/02/2014, 23:02
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Calcular tiempo entre dos horas (HH:MM:SS)

Bueno, como le dijiste a TMeister lo siguiente:

Cita:
Iniciado por corei7 Ver Mensaje
Sería posible hacerlo únicamente con el formato HH:MM:SS?
Supuse que solamente pensabas manipular las horas y no las fechas, sin embargo, como lo que estoy haciendo es sumar horas en negativo al primer objeto Date, el resultado no se altera. Más claro, supón que en el primer objeto son las 04:45:23 del 17 de mayo del 2014 y en el segundo son las 03:27:34 del 31 de enero de 1983, lo que hago es añadir las 03:27:34 horas del segundo objeto a las 04:45:23 del primero pero en negativo y como sumar una cantidad negativa equivale a restar, pues ahí tienes lo que buscabas. La idea es que al restar, la hora del primer objeto sea mayor que la del segundo, pero si fuera al revés, es decir, si compararas las 04:45:23 del 21 de febrero con las 04:45:24 del 20 de febrero (hora del segundo objeto mayor que la del primero), resultará en 23:59:59.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #7 (permalink)  
Antiguo 13/02/2014, 14:53
 
Fecha de Ingreso: febrero-2013
Mensajes: 119
Antigüedad: 11 años, 9 meses
Puntos: 2
Respuesta: Calcular tiempo entre dos horas (HH:MM:SS)

Cita:
Iniciado por Alexis88 Ver Mensaje
Bueno, como le dijiste a TMeister lo siguiente:

Supuse que solamente pensabas manipular las horas ...

Saludos
Muchas gracias Alexis, de momento me sirve... Un saludo!
  #8 (permalink)  
Antiguo 17/11/2015, 08:59
 
Fecha de Ingreso: noviembre-2015
Mensajes: 1
Antigüedad: 9 años
Puntos: 0
Respuesta: Calcular tiempo entre dos horas (HH:MM:SS)

porfa quien me puede ayudar con este codigo necesito ponerlo en un ciclo que se ejecute mientras la hora inicial sea menor a la hora final

var horaI = $("#txtHoraInicial").val().split(":");
var horaT = $("#txtHoraFinal").val().split(":");
var intervalo = $("#txtIntervalo").val().split(":");
var horaIni = new Date();
var inter = new Date();

horaIni.setHours(horaI[0], horaI[1]);
inter.setHours(intervalo[0], intervalo[1]);

horaIni.setHours(horaIni.getHours() + inter.getHours(), horaIni.getMinutes() + inter.getMinutes());

$("#txtNuevaHora").val((horaIni.getHours() ? horaIni.getHours() + (horaIni.getHours() > 1 ? ":" : " hora") : "") + (horaIni.getMinutes() ? "" + horaIni.getMinutes() + (horaIni.getMinutes() > 1 ? "" : " minuto") : "00"));

Etiquetas: calcular, horas, tiempo
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 09:45.