【问题标题】:Detecting changes to system time in JavaScript在 JavaScript 中检测系统时间的变化
【发布时间】:2010-07-29 22:33:48
【问题描述】:

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

【问题讨论】:

  • 如果用户正在更改您的系统时间,那么您遇到了一些严重的问题。
  • 哦,这个问题真正有趣的部分是已经设置的超时和间隔计时器会发生什么?我不知道这是如何在真正的浏览器中实现的;是否有一个低级的细粒度例程以基本频率通过超时/间隔队列?

标签: javascript datetime


【解决方案1】:

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

【讨论】:

  • 就是这样。谢谢。但是时光倒流,什么都没有发生。
  • @yomash,这可能是 Windows 或 Chrome 的问题;我注意到自己需要一段时间才能及时传播更改。但是,它确实会发生,但比您预期的要晚几秒钟。
  • Safari 或 Mobile Safari 等浏览器在选项卡失去焦点时会显着降低 setInterval 频率(或将其全部停止),因此请注意此方法很容易产生误报。
【解决方案2】:

使用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 看看它们是否差异太大。

【讨论】:

    【解决方案3】:

    检查时间没有太大变化的区间函数:

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

    【讨论】:

      【解决方案4】:

      不要认为您的要求有解决方案,但您可以获得用户时区偏移量。

      new Date().getTimezoneOffset() * -1
      

      这将返回从 GMT 开始的偏移量(以分钟为单位)。请记住,尽管这没有考虑 DST。

      【讨论】:

      • 澄清一下,夏令时会产生一个具有不同偏移量的有效不同时区。例如东部时间为 EST (-5) vs EDT (-4)。
      【解决方案5】:
      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 解释器不会在指定的时间触发事件。

      希望这会有所帮助!

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 我的页面在准确的时间产生了事件。当用户更改他的系统时间时,例如跳过几个事件。
        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2011-01-16
          • 1970-01-01
          • 1970-01-01
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多