2013-04-24 90 views
7

我已经四处寻找如何做到这一点,我发现了很多复杂代码的例子。使用 林这样的:计算两次之间的时间差javascript

var time1 = new Date(); 
var time1ms= time1.getTime(time1); //i get the time in ms 

那么我这样做的代码

var time2 = new Date(); 
var time2ms= time2.getTime(time2); 

和finnally的另一部分:

var difference= time2ms-time1ms; 
var lapse=new Date(difference); 
label.text(lapse.getHours()+':'+lapse.getMinutes()+':'+lapse.getSeconds()); 

这个伟大的工程,除了一个问题,小时它给了我总是+1,所以我必须添加到代码(time.getHours() - 1),否则它给了我一个多小时....

我认为比其他所有例子更容易做到这一点......但我仍然不明白为什么我需要添加'-1'才能有正确的流逝。

THANKs !!!

回答

11

问题是你的时区。

当你这样做new Date(difference),当你做你的lapse.getHours()时区在计算中使用你创建一个Date对象代表1月1日,1970年后exatcly difference毫秒的时刻。你不能通过Javascript修改你的时区,也不能修改这个行为。不是没有一些 Javascript技巧。

但是你difference确实代表日期,但日期的差异。治疗是这样的,并计算小时,分钟和秒这样的:

var hours = Math.floor(difference/36e5), 
    minutes = Math.floor(difference % 36e5/60000), 
    seconds = Math.floor(difference % 60000/1000); 

此外,在创建lapse时,你可以把你的时区到:

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

,但我不会推荐:Date对象是为你的目的矫枉过正。

+0

什么IM试着代表它是日期的差别,我会用你的线“变种小时= Math.floor(差/ 36E 5)'因为我没有问题的分钟和秒......这应该工作,对吧?非常感谢! – user2314770 2013-04-24 10:35:56

+0

我用Math.floor(差异/ 36e5),它的工作原理,只是为了好奇心是什么意思36e5? – user2314770 2013-04-24 10:54:29

+3

36e5是数字3600000 - 它被称为“科学记数法”,等于36 * 10^5 – DThought 2013-04-24 12:17:59

2

注意的是,在getTimezoneOffset()回报分钟的值,所以如果你想使用的推移,你可以纠正它像这样的时区差异:

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

打印出来的时间差在人类可读的形式