2010-07-29 151 views
8

如何編寫腳本來檢測用戶何時在JS中更改其系統時間?使用JavaScript檢測系統時間更改

+6

如果用戶正在更改**系統時間,您會遇到一些嚴重問題。 – Pointy 2010-07-29 22:35:57

+2

@Pointy:在我的編輯之前,該評論更有意義:p – 2010-07-29 22:37:40

+0

「他們的」。當然,謝謝 – AHOYAHOY 2010-07-29 22:39:36

回答

7

沒有(可移植的)方式來跟蹤JavaScript中的變量。另外,日期信息並不在DOM中,因此您不會觸發DOM事件。

您可以做的最好的方法是使用setInterval定期檢查(每秒?)。 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

就是這樣。謝謝。但時光倒流,沒有任何反應。 – AHOYAHOY 2010-07-29 23:32:05

+0

@yomash,這可能是Windows或Chrome的問題;我注意到我自己花了一段時間才把變化傳播回來。但是,它確實發生了,但是比預期的晚了幾秒鐘。 – strager 2010-07-30 00:22:45

+0

是的,鉻問題(在Ubuntu上)。謝謝。 – AHOYAHOY 2010-07-30 00:46:08

0

你的意思是如果他們將自己的系統時間改變成錯誤的東西?您可以詢問用戶的時區,並從服務器獲取正確的時間,然後將其與用戶的系統時間進行比較。

+0

我的頁面在確切的時間生成了事件。當用戶改變他的系統時間時,例如跳過幾個事件。 – AHOYAHOY 2010-07-29 22:43:57

0

不要以爲有你問什麼,但你可以得到用戶的時區偏移的解決方案。

new Date().getTimezoneOffset() * -1 

這將返回GMT以後的偏移量。請記住,雖然這不考慮DST。

1

檢查中,時間並沒有改變太多的時間間隔功能:

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 

測試在Windows上使用Opera & FF和完美的作品。

+0

我的不好,沒有仔細閱讀代碼。 – mattbasta 2010-07-29 22:47:58

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

理論上,這應該起作用。它會每秒檢查一次以確保時間沒有改變。請注意,我使用1100毫秒,因爲大多數JS解釋器不會在指定的時間觸發事件。

希望這會有所幫助!

0

您可以每30秒檢查一次,等等。如果新時間超過30秒+/-某個閾值,您可以進行更詳盡的比較以確定它已更改多少。