JavaScript中检测系统时间的更改

16

如何编写一个JS脚本来检测用户更改系统时间?


8
如果用户可以更改你的系统时间,那么你的问题很严重。 - Pointy
1
哦,这个问题中真正有趣的部分是已经设置了超时和间隔计时器会发生什么?我不知道实际浏览器中如何实现;是否存在一种低级细粒度例程,在基本频率上遍历超时/间隔队列? - Pointy
7个回答

12

在 JavaScript 中,没有(可移植的)方法来跟踪变量。此外,日期信息不包含在 DOM 中,因此您无法触发 DOM 事件。

最好的方法是使用 setInterval 定期检查(每秒钟?)。示例

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

就是这样。谢谢。但是回移时间,什么也没有发生。 - AHOYAHOY
@yomash,这可能是Windows或Chrome的问题;我注意到它需要一段时间才能将更改传播回来。不过,它确实会发生,只是比你预期的晚几秒钟。 - strager
7
当浏览器标签页失去焦点时,像Safari或Mobile Safari这样的浏览器会大幅降低setInterval的频率(或停止),因此请注意,该方法很容易产生误报。 - bendytree

2

检查一个时间间隔函数,确保时间没有发生太大的变化:

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测试过,运行完美。

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解释器不会在完全指定的时间触发事件。
希望这可以帮助!

1
使用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()的经过时间与Date.now()的经过时间,以查看它们是否相差太多。


更正:var t1 = Date.now() - JCraine

1

我认为你所要求的问题可能没有解决方案,但是你可以获取用户的时区偏移量。

new Date().getTimezoneOffset() * -1

此函数返回与 GMT 的时差(以分钟为单位)。但请注意,它不考虑夏令时。


澄清一下,夏令时会产生一个具有不同偏移量的有效不同时区。例如,东部时间作为EST(-5)与EDT(-4)。 - MattH

0

你的意思是他们把自己的系统时间改成了错误的时间吗?你可以要求用户提供他们所在的时区,从服务器获取正确的时间,然后将其与用户的系统时间进行比较。


我的页面在确切的时间生成事件。例如,当用户更改系统时间时,会跳过几个事件。 - AHOYAHOY

0

你可以每30秒检查一次,如果新的时间偏差超过30秒+/-某个阈值,你可以进行更详尽的比较来确定它已经改变了多少。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接