Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计算两次之间的时间差_Javascript_Date_Time_Gettime - Fatal编程技术网

Javascript 计算两次之间的时间差

Javascript 计算两次之间的时间差,javascript,date,time,gettime,Javascript,Date,Time,Gettime,我四处寻找如何做到这一点,我发现了许多复杂代码的例子。 我在用这个: var time1 = new Date(); var time1ms= time1.getTime(time1); //i get the time in ms 然后我在代码的另一部分这样做 var time2 = new Date(); var time2ms= time2.getTime(time2); 最后: var difference= time2ms-time1ms; var lapse=new Dat

我四处寻找如何做到这一点,我发现了许多复杂代码的例子。 我在用这个:

var time1 = new Date();
var time1ms= time1.getTime(time1); //i get the time in ms  
然后我在代码的另一部分这样做

var time2 = new Date();
var time2ms= time2.getTime(time2); 
最后:

var difference= time2ms-time1ms;
var lapse=new Date(difference);  
label.text(lapse.getHours()+':'+lapse.getMinutes()+':'+lapse.getSeconds());
这非常有效,除了一个问题,它给我的时间总是+1,因此我必须添加到代码中(time.getHours()-1),否则它会给我多出一个小时

我认为这是一种比其他所有例子更简单的方法。。。但是我仍然不明白为什么我需要添加“-1”以获得正确的失效


谢谢

问题在于你的时区

执行新日期(差异)操作时,您正在创建一个
日期
对象,该对象表示1970年1月1日之后的瞬间。当您执行
laver.getHours()
时,您的时区将用于计算。您不能通过Javascript修改时区,也不能修改此行为。没有一些繁重的Javascript技巧就不行

但是您的
差异
并不代表日期,而是日期的差异。这样处理,并按如下方式计算小时、分钟和秒:

var hours = Math.floor(difference / 36e5),
    minutes = Math.floor(difference % 36e5 / 60000),
    seconds = Math.floor(difference % 60000 / 1000);
lapse = new Date(difference); 
tz_correction_minutes = new Date().getTimezoneOffset() - lapse.getTimezoneOffset();
lapse.setMinutes(offset_date.getMinutes() + tz_correction_minutes);
或者,您可以在创建
延时时考虑您的时区:

var lapse = new Date(difference + new Date().getTimezoneOffset() * 1000);

但我不建议这样做:
Date
对象对于您来说是多余的。

请注意,在
getTimezoneOffset()中,
以分钟为单位返回一个值,因此如果您想使用延时,您可以按如下方式更正时区差异:

var hours = Math.floor(difference / 36e5),
    minutes = Math.floor(difference % 36e5 / 60000),
    seconds = Math.floor(difference % 60000 / 1000);
lapse = new Date(difference); 
tz_correction_minutes = new Date().getTimezoneOffset() - lapse.getTimezoneOffset();
lapse.setMinutes(offset_date.getMinutes() + tz_correction_minutes);
现在您可以执行以下操作:

label.text(lapse.getDate()-1+' days and'  +lapse.getHours()+':'+lapse.getMinutes()+':'+lapse.getSeconds());

要以人类可读的形式打印出时差

我试图表示的是日期的差异,我将使用您的行“var hours=Math.floor(difference/36e5)”,因为我对分钟和秒没有问题。。。那应该有用,对吗?谢谢!我使用了Math.floor(差分/36e5),它很有效,只是出于好奇36e5是什么意思?36e5是3600000的数字,它被称为“科学记数法”,等于36*10^5@DThought没错,这是一小时内的毫秒数。我使用科学符号,因为在这种情况下它更短。我也用6e4。@user2314770不客气。如果答案对你有帮助,记得接受它。别忘了,如果时区移动了一个小时(比如在印度),你的代码可能仍然有分钟的问题。我仍然建议您自己计算分钟和秒数。