2013-04-24 2 views
7

Я обдумываю, как это сделать, и я нашел много примеров со сложным кодом. Im с помощью этого:Рассчитать разницу во времени между двумя значениями 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', чтобы иметь правильный интервал.

ЧИТАЕТ!

ответ

11

Проблема заключается в вашем часовом поясе.

Когда вы new Date(difference), вы создаете Date объект, который представляют момент exatcly difference миллисекунды после 1 января 1970 года Если вы lapse.getHours() ваш часовой пояс используется в вычислениях. Вы не можете изменять свой часовой пояс через Javascript и не можете изменять это поведение. Не без heavy 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

Что им сделаешь, чтобы представить это различие дат, я буду использовать свою линию «Var часов = Math.floor (разница/36e 5) «так как у меня нет проблем с минутами и секундами ... Это должно работать, правильно? Большое спасибо! – user2314770

+0

Я использовал Math.floor (разница/36e5), и он работает, просто для любопытства, что это значит 36e5? – user2314770

+3

36e5 - номер 3600000 - это называется «научная нотация» и равно 36 * 10^5 – DThought

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

распечатать разницу во времени в читабельной форме

Смежные вопросы