在JavaScript中检测对系统时间的更改

在JavaScript中检测对系统时间的更改,javascript,datetime,Javascript,Datetime,我如何编写脚本来检测用户何时在JS中更改系统时间?你的意思是他们是否将自己的系统时间更改为错误的时间?您可以向用户询问他们的时区并从服务器获取正确的时间,然后将其与用户的系统时间进行比较。在JavaScript中没有(可移植的)方法来跟踪变量。此外,日期信息不在DOM中,因此您不可能触发DOM事件 您最好使用setInterval定期(每秒?)检查: 不要认为有一个解决方案可以满足你的要求,但是你可以得到用户的时区偏移量 new Date().getTimezoneOffset() * -1

我如何编写脚本来检测用户何时在JS中更改系统时间?

你的意思是他们是否将自己的系统时间更改为错误的时间?您可以向用户询问他们的时区并从服务器获取正确的时间,然后将其与用户的系统时间进行比较。

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

您最好使用
setInterval
定期(每秒?)检查:


不要认为有一个解决方案可以满足你的要求,但是你可以得到用户的时区偏移量

new Date().getTimezoneOffset() * -1

这将以分钟为单位返回与GMT之间的偏移量。请记住,这并不考虑DST。

在间隔函数中检查时间变化是否太大:

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
使用Opera&FF在Windows上进行测试,效果完美。

var last\u time=new Date().getTime();
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);
setInterval(函数(){ var time=new Date().getTime(); var偏移=时间-最后一次时间; 如果(偏移量<0 | |偏移量>1500){ //时间变了 } 最后一次=时间; }, 1000);
理论上,这应该是可行的。它将每秒检查一次,以确保时间没有改变。注意,我使用1100毫秒,因为大多数JS解释器不会在指定的时间触发事件


希望这有帮助

您可以每30秒检查一次,等等。如果新时间的关闭时间超过30秒+/-某个阈值,您可以进行更详尽的比较,以确定更改了多少。

使用
performance.now()
获取持续时间,该持续时间与系统时钟无关

var t0=performance.now();
doSomething();
var t1=performance.now();
log(“对doSomething的调用花费了”+(t1-t0)+“毫秒”);

然后你可以比较
性能。now()
经过时间和
日期。now()
经过时间,看看它们是否相差太大。

哇,如果用户更改系统时间,你会遇到一些严重的问题。哦,这个问题真正有趣的部分是,已经设置的超时和间隔计时器会发生什么情况?我不知道这在真正的浏览器中是如何实现的;是否有一个低级别的细粒度例程以基本频率通过超时/间隔队列?My page在准确的时间生成了事件。当用户更改系统时间时,例如跳过几个事件。就是这样。谢谢但是倒班时间,什么也没发生。@yomash,这可能是Windows或Chrome的问题;我注意到我自己花了一段时间才将变化传播回过去。但是,这种情况确实发生了,但只比您预期的晚了几秒钟。当选项卡失去焦点时,Safari或Mobile Safari等浏览器会显著降低设置间隔频率(或将其全部停止),因此请注意,这种方法很容易产生假警报。为了澄清,夏令时产生了一个具有不同偏移量的不同时区。e、 东部时间是东部标准时间(-5)vs东部标准时间(-4)。我不确定为什么这次投票没有被提高。。。。
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);