jQuery计算两个字段之间的小时差

9
我有一个表单,其中用户选择输入时间(start_time,end_time),我希望在这些字段更改时重新计算另一个字段的值。
我想做的是获取两个时间之间的小时数。例如,如果我的开始时间为5:30,结束时间为7:50,则我想将结果2:33放入另一个字段中。
我的输入表单时间格式为HH:MM:SS。
到目前为止,我尝试了...
$('#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:332.33 还是 2:20?(根据语境无法确定具体含义) - Fabrizio Calderan
new Date("1970-1-1 " + end_time)。仅仅是一个时间吗?我不这么认为... - jenson-button-event
2.33的小数部分应该是总小时的百分比。因此,在这种情况下,2:20中的20/60为.33。 - user1496306
输入中没有日期,只是简单的“HH:MM:SS”。 - user1496306
1
@lifeinthefridge,因此使用一个常量日期片段。 - jenson-button-event
4个回答

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

试试这个


2
我从这里得到了一个NaN结果?这也是我尝试使用这个答案时遇到的问题? - user1496306
例如:我有新的日期(“1970-1-1 12:00”) - 新的日期(“1970-1-1 10:55”))/ 1000/60/60。 答案是1.083333... 1是小时,但为什么分钟是0.83?看起来答案是1.05 1小时和5分钟?我有点困惑。也许这个可以得到正确的答案http://jsfiddle.net/VDnND/ - aldrien.h
@aldrien 不是1.083分钟,而是1.083小时。如果你想要总分钟数,只需将1.083333乘以60 - 秒再乘以60等等。OP确实要求小时,总有abs()函数可以使用。 - jenson-button-event

7
这取决于你要输出的格式。在使用Date对象进行数学计算时,它将它们转换为自1970年1月1日00:00:00 UTC以来的毫秒数。通过减去两者(如果不知道哪个大,则取绝对值),您可以获得两者之间的原始毫秒数。毫秒之间。从那里,您可以将其转换为任何您想要的格式。要获取秒数,只需将该数字除以1000。要获取小时、分钟和秒钟:
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);

当然,你可以使用一些条件语句来使它更加智能化,但这只是为了向你展示,使用数学可以以任何形式格式化它。只需要记住,Date对象始终具有日期,而不仅仅是时间,因此您可以将其存储在Date对象中,但如果大于24小时,则会得到不真正表示两者之间“距离”的信息。


感谢您提供这么详细的回复!虽然这不是我用来格式化时间的确切方法,但这篇文章帮助我更好地理解了日期函数和可能性。 - user1496306

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

3

请尝试以下方法:

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

如果我使用大于23的任何分钟值,就会得到一个NaN结果?很奇怪...不过,我得到了一个非常大的数字返回,我认为那是ngmiceli之前提到的原始毫秒数。 - user1496306

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接