【发布时间】:2010-07-29 22:33:48
【问题描述】:
如何编写脚本来检测用户何时在 JS 中更改系统时间?
【问题讨论】:
-
如果用户正在更改您的系统时间,那么您遇到了一些严重的问题。
-
哦,这个问题真正有趣的部分是已经设置的超时和间隔计时器会发生什么?我不知道这是如何在真正的浏览器中实现的;是否有一个低级的细粒度例程以基本频率通过超时/间隔队列?
标签: javascript datetime
如何编写脚本来检测用户何时在 JS 中更改系统时间?
【问题讨论】:
标签: javascript datetime
在 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);
【讨论】:
使用performance.now()获取持续时间,这将独立于系统时钟
见https://developer.mozilla.org/en-US/docs/Web/API/Performance/now
var t0 = performance.now();
doSomething();
var t1 = performance.now();
console.log("Call to doSomething took " + (t1 - t0) + " milliseconds.");
然后你可以比较 performance.now() elapsed 和 Date.now() elapsed 看看它们是否差异太大。
【讨论】:
检查时间没有太大变化的区间函数:
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 进行测试,运行完美。
【讨论】:
不要认为您的要求有解决方案,但您可以获得用户时区偏移量。
new Date().getTimezoneOffset() * -1
这将返回从 GMT 开始的偏移量(以分钟为单位)。请记住,尽管这没有考虑 DST。
【讨论】:
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 解释器不会在指定的时间触发事件。
希望这会有所帮助!
【讨论】:
您的意思是他们是否将自己的系统时间更改为错误的东西?您可以向用户询问他们的时区并从服务器获取正确的时间,然后将其与用户的系统时间进行比较。
【讨论】:
您可以每 30 秒检查一次,等等。如果新时间的偏差超过 30 秒 +/- 某个阈值,您可以进行更详尽的比较以确定它已更改了多少。
【讨论】: