2010-07-29 22 views
8

Làm cách nào để viết một tập lệnh để phát hiện thời điểm người dùng thay đổi thời gian hệ thống của họ trong JS?Phát hiện các thay đổi đối với thời gian hệ thống trong JavaScript

+6

Bạn có một số vấn đề nghiêm trọng nếu người dùng thay đổi ** thời gian hệ thống ** của bạn. – Pointy

+2

@Pointy: nhận xét đó có ý nghĩa hơn trước chỉnh sửa của tôi: p –

+0

"của họ". tất nhiên, cảm ơn – AHOYAHOY

Trả lời

7

Không có cách nào (di động) để theo dõi biến trong JavaScript. Ngoài ra, thông tin ngày tháng không nằm trong DOM, do đó bạn không có khả năng xảy ra sự kiện DOM.

Điều tốt nhất bạn có thể làm là sử dụng setInterval để kiểm tra định kỳ (mỗi giây?). Example:

function timeChanged(delta) { 
    // Whatever 
} 

setInterval(function timeChecker() { 
    var oldTime = timeChecker.oldTime || new Date(), 
     newTime = new Date(), 
     timeDiff = newTime - oldTime; 

    timeChecker.oldTime = newTime; 

    if (Math.abs(timeDiff) >= 5000) { // Five second leniency 
    timeChanged(timeDiff); 
    } 
}, 500); 
+0

Chính xác là như vậy. Cảm ơn. Nhưng sự thay đổi trở lại thời gian, không có gì xảy ra. – AHOYAHOY

+0

@yomash, Đây có thể là sự cố Windows hoặc Chrome; Tôi nhận thấy phải mất một thời gian để tuyên truyền những thay đổi trở lại trong thời gian bản thân mình. Nó xảy ra, tuy nhiên, nhưng chỉ một vài giây sau hơn bạn mong đợi. – strager

+0

có, vấn đề về chrome (trên ubuntu). Cảm ơn bạn. – AHOYAHOY

0

Bạn có nghĩa là nếu họ đang thay đổi thời gian hệ thống của riêng họ thành một cái gì đó sai? Bạn có thể yêu cầu người sử dụng cho múi giờ của họ và nhận được thời gian chính xác từ máy chủ, và sau đó so sánh nó với thời gian hệ thống của người dùng.

+0

Trang của tôi đã tạo sự kiện vào đúng thời điểm. Khi người dùng thay đổi thời gian hệ thống của mình, sau đó bỏ qua một vài sự kiện chẳng hạn. – AHOYAHOY

0

Đừng nghĩ rằng có giải pháp cho những gì bạn đang yêu cầu nhưng bạn có thể bù đắp múi giờ cho người dùng.

new Date().getTimezoneOffset() * -1 

Điều này trả về giá trị tính bằng phút từ GMT. Bare trong tâm trí mặc dù điều này không đưa DST vào xem xét.

1

Kiểm tra trong một chức năng khoảng thời gian đó đã không thay đổi quá nhiều:

function getTime() { 
    var d = new Date(); 
    return d.getTime(); 
} 

function checkTime() { 
    if (Math.abs(getTime() - oldtime) > 2000) { // Changed by more than 2 seconds? 
    alert("You changed the time!"); 
    } 
    oldtime = getTime(); 
} 

var oldtime = getTime(); 
setInterval(checkTime, 1000); // Check every second that the time is not off 

Thử nghiệm trên Windows với Opera & FF và hoạt động hoàn hảo.

+0

Rất tiếc, tôi không đọc kỹ mã này. – mattbasta

1
var last_time = new Date().getTime(); 
setInterval(function() { 
    var time = new Date().getTime(); 
    var offset = time - last_time; 
    if(offset < 0 || offset > 1500) { 
     // Time has been changed 
    } 
    last_time = time; 
}, 1000); 

Về lý thuyết, điều này sẽ hiệu quả. Nó sẽ kiểm tra mỗi giây để đảm bảo rằng thời gian đã không được thay đổi. Lưu ý rằng tôi sử dụng 1100 mili giây vì hầu hết các phiên dịch JS không kích hoạt các sự kiện vào đúng thời gian được chỉ định.

Hy vọng điều này sẽ hữu ích!

0

Bạn có thể kiểm tra cứ sau 30 giây, v.v.

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