2012-08-09 8 views
7

Tengo dos campos en mi formulario donde los usuarios seleccionan un tiempo de entrada (start_time, end_time) Me gustaría, en el cambio de estos campos, recalcular el valor para otro campo.Jquery diferencia de tiempo en horas de dos campos

Lo que me gustaría hacer es obtener la cantidad de horas entre 2 veces. Entonces, por ejemplo, si tengo un start_time de 5:30 y un tiempo de finalización de 7:50, me gustaría poner el resultado 2:33 en otro campo.

Mis tiempos son introducidos de forma en el formato HH: MM: SS

Hasta ahora he intentado ...

$('#start_time,#end_time').on('change',function() 
{ 
    var start_time = $('#start_time').val(); 
    var end_time = $('#end_time').val(); 

    var diff = new Date(end_time) - new Date(start_time); 



    $('#setup_hours').val(diff); 
+4

'2: 33',' 2.33' o '2: 20' en su lugar? – fcalderan

+0

o 'nueva Fecha (" 1970-1-1 "+ end_time)'. es solo un tiempo en sí mismo una cita? no lo creo ... –

+0

2.33 La segunda parte del decimal debe ser el porcentaje de una hora total. Entonces 2:20 en este caso 20/60 es .33 –

Respuesta

10

tratar

var diff = (new Date("1970-1-1 " + end_time) - new Date("1970-1-1 " + start_time))/1000/60/60; 

have a fiddle

+2

Me sale un resultado de NaN devuelto por esto? Este es también el problema que estoy tratando de usar para esta respuesta también? –

+1

el violín también es NaN –

+0

nvm GOT IT! Esto ayudó gracias! –

3

intente esto:

var diff = new Date("Aug 08 2012 9:30") - new Date("Aug 08 2012 5:30"); 
diff_time = diff/(60*60*1000); 
+0

Estoy obteniendo un resultado NaN devuelto de esto si uso cualquier valor de minuto mayor que 23? Extraño ... Sin embargo, estoy obteniendo un gran número devuelto, que supongo que es milisegundos en bruto como mencionó ngmiceli antes de eso. –

+0

nvm GOT IT! Esto ayudó gracias! –

4

Depende del formato en el que desee que aparezca su salida. Al realizar operaciones matemáticas con objetos Date, los convierte en milisegundos desde la hora de Epoch (1 de enero de 1970, 00:00:00 UTC). Al restar los dos (y tomando el valor absoluto si no sabes cuál es mayor) obtienes el número bruto de milisegundos entre los dos.

A partir de ahí, puede convertirlo al formato que desee. Para obtener la cantidad de segundos, simplemente divide ese número por 1000. Para disfrutar de horas, minutos y segundos:

var diff = Math.abs(new Date(end_time) - new Date(start_time)); 
var seconds = Math.floor(diff/1000); //ignore any left over units smaller than a second 
var minutes = Math.floor(seconds/60); 
seconds = seconds % 60; 
var hours = Math.floor(minutes/60); 
minutes = minutes % 60; 

alert("Diff = " + hours + ":" + minutes + ":" + seconds); 

Se podría, por supuesto, hacer esto más inteligente con algunos condicionales, pero esto es sólo para mostrar que el uso de las matemáticas puede darle formato en cualquier forma que desee. Solo tenga en cuenta que un objeto Date siempre tiene una fecha, no solo una hora, por lo que puede almacenar esto en un objeto Date pero si es mayor a 24 horas terminará con información que realmente no representa una "distancia" entre el dos.

+0

¡Gracias por esta detallada respuesta! Si bien, este no es necesariamente el método exacto que utilicé para formatear el tiempo, esta publicación me ayudó a entender mejor la función de fecha y las posiblidades. –

5
var start = '5:30'; 
    var end = '7:50'; 
    s = start.split(':'); 
    e = end.split(':'); 
    min = e[1]-s[1]; 
    hour_carry = 0; 
    if(min < 0){ 
     min += 60; 
     hour_carry += 1; 
    } 
    hour = e[0]-s[0]-hour_carry; 
    min = ((min/60)*100).toString() 
    diff = hour + ":" + min.substring(0,2); 
    alert(diff); 
Cuestiones relacionadas