2013-04-24 49 views
7

Tôi đã xem xét cách thực hiện việc này và tôi đã tìm thấy rất nhiều ví dụ với mã phức tạp. Im sử dụng này:Tính chênh lệch thời gian giữa hai lần javascript

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

sau đó tôi làm điều này trong một phần khác của mã

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

và finnally:

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

này hoạt động tuyệt vời, ngoại trừ một vấn đề, những giờ nó gaves tôi luôn luôn +1 vì vậy tôi phải thêm vào các mã (time.getHours() - 1) nếu không nó gaves tôi một giờ nữa ....

Tôi nghĩ là một cách dễ dàng hơn để làm điều đó hơn tất cả các ví dụ khác xung quanh ... nhưng tôi vẫn không hiểu tại sao tôi cần thêm '-1' để có sai sót chính xác.

THanks !!!

Trả lời

11

Sự cố là múi giờ của bạn.

Khi bạn làm new Date(difference), bạn đang tạo ra một đối tượng Date đại diện cho thời điểm này exatcly difference mili giây sau ngày 01 tháng 1, 1970. Khi bạn làm lapse.getHours() múi giờ của bạn được sử dụng trong việc tính toán. Bạn không thể sửa đổi múi giờ của mình thông qua Javascript và không thể sửa đổi hành vi này. Không phải không có một số nặng Thủ thuật Javascript.

Nhưng difference của bạn không đại diện cho một ngày, nhưng chênh lệch khác biệt ngày. Điều trị là như vậy, và tính giờ, phút và giây như thế này:

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

Ngoài ra, bạn có thể mất múi giờ của bạn vào tài khoản khi tạo lapse:

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

nhưng tôi sẽ không khuyên bạn này : Date đối tượng quá mức cần thiết cho mục đích của bạn.

+0

gì tryin im để đại diện cho nó là một sự khác biệt của ngày, tôi sẽ sử dụng dòng của bạn 'giờ var = Math.floor (chênh lệch/36e 5) 'kể từ khi tôi không có vấn đề với phút và giây ... Điều đó sẽ làm việc, phải không? Cảm ơn rất nhiều! – user2314770

+0

tôi đã sử dụng Math.floor (sự khác biệt/36e5), và nó hoạt động, chỉ cho tò mò có nghĩa là gì 36e5? – user2314770

+3

36e5 là số 3600000 - được gọi là "ký pháp khoa học" và bằng 36 * 10^5 – DThought

2

Lưu ý rằng trong getTimezoneOffset() trả về một giá trị trong vài phút, vì vậy nếu bạn muốn sử dụng trôi đi, bạn có thể sửa chữa nó cho phần chênh lệch múi giờ như thế này:

lapse = new Date(difference); 
tz_correction_minutes = new Date().getTimezoneOffset() - lapse.getTimezoneOffset(); 
lapse.setMinutes(offset_date.getMinutes() + tz_correction_minutes); 

bây giờ bạn có thể làm:

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

để in ra sự khác biệt thời gian ở dạng có thể đọc được con người

Các vấn đề liên quan