Рассчитать разницу во времени между двумя временами 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); 

и наконец:

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

Это прекрасно работает, за исключением одной проблемы: часы, которые он дал мне, всегда равны +1, поэтому я должен добавить в код (time.getHours()-1), иначе он даст мне еще один час. ...

Я думаю, что это более простой способ сделать это, чем все остальные примеры... но я все еще не понимаю, почему мне нужно добавить «-1», чтобы получить правильный промежуток времени.

Благодарность!!!


person pistoleta    schedule 24.04.2013    source источник


Ответы (2)


Проблема в вашем часовом поясе.

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

person MaxArt    schedule 24.04.2013
comment
То, что я пытаюсь представить, это разница дат, я буду использовать вашу строку «var hours = Math.floor(difference/36e5)», так как у меня нет проблем с минутами и секундами... Это должно работать, верно? Большое спасибо! - person pistoleta; 24.04.2013
comment
я использовал Math.floor(difference/36e5), и это работает, просто для любопытства, что это значит 36e5? - person pistoleta; 24.04.2013
comment
36e5 — это число 3600000 — это называется научной записью и равно 36*10^5. - person DThought; 24.04.2013
comment
@DTought Точно, это количество миллисекунд в часе. Я использую научную нотацию, потому что в данном случае она короче. Я тоже использую 6e4. - person MaxArt; 24.04.2013
comment
@ user2314770 Не за что. Не забудьте принять ответ, если он вам помог. И не забывайте, что ваш код может по-прежнему иметь проблемы с минутами, если часовой пояс сдвинут на доли часа (как, например, в Индии). Я все же рекомендую вычислять минуты и секунды самостоятельно. - person MaxArt; 24.04.2013

Обратите внимание, что в 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());

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

person Matthijs    schedule 21.06.2013