将Javascript时钟与服务器时钟同步

时间:2010-11-25 01:17:07

标签: php javascript time clock

背景

我正在创建一个AJAX聊天系统。它看起来像这样:

  

迈克 - 嗨简 - 5分钟前

     

- 嗨迈克 - 4分钟前

     

迈克 - 它是怎么回事 - 3秒前

     

- 我做得很好 - 1秒前

Javascript每分钟轮询服务器,服务器响应10条最新消息。附加到每个消息的是Unix时间戳(PHP time())。 Javascript负责将用户当前拥有的缓冲消息与此新服务器响应合并。消息的交错和“X time ago”消息的准确性取决于Javascript时钟与服务器时钟同步的程度。


问题

如何准确地将Javascript时钟与服务器时钟同步?以下是我到目前为止的情况。我想让它更准确。目前它没有考虑进行同步的Ajax的往返时间。我如何知道发送,处理和接收的往返比例?另外,你如何处理时钟晶体被破坏的用户 - 例如:格林尼治标准时间下午7:20,但他们的时钟实际上是格林尼治标准时间下午7:15?

Clock = {
   serverOffset = 0;

   synch: function() {
      new Ajax.Request(
         '/getServerTime.php', {
            onSuccess: function(transport) {
               this.serverOffset = parseInt(transport.responseText) - 
                  new Date().getTime() / 1000;
            }
         }
      );
   },

   getServerTime: function(myTime) {
      if (typeof(myTime) === 'undefined') {
         myTime = new Date().getTime() / 1000;
      }
      return myTime + this.serverOffset;
   },

   serverToMyTime: function(serverTime) {
      return serverTime - this.serverOffset;
   }
}

3 个答案:

答案 0 :(得分:3)

我们遇到了类似的问题。我们的解决方案是简单地忽略浏览器时钟。如果消息带有服务器时间戳,则只需按时间戳对它们进行排序。然后,您需要做的就是在呈现数据时,将其转换为浏览器时间。所有计算和排序都基于服务器时间。这样,您所要做的就是让服务器时间保持同步状态。

答案 1 :(得分:3)

正如我在this answer中解释的那样,你的精确程度是有限的 - 本质上,任何小于请求往返时间的时钟偏差都是不可检测的。如果您确实需要时间尽可能精确,请为服务器创建一个特殊的请求类型,以便尽快获得时间,并尽可能快地完成往返。

但是,您可以识别本地时钟明显疯狂的浏览器,因为观察到的服务器时间不会落在请求的本地开始和结束时间之间。由于您无法将其收紧得太远,只需在本地请求[start,end]间隔内选择一个任意时间,并将其视为等同于接收的服务器时间。

答案 2 :(得分:1)

使用闪存和套接字服务器。如果您需要100%准确。我为应用程序编写了一个套接字服务器,它每1秒向flash元素广播一次,并告诉它确切显示的内容。

这是一款基于财务的应用,需要始终保持100%准确。

我们还将其与FMS配对,以便能够穿过企业防火墙。

如果您使用javascript,您将无法达到准确性。

很可能html5将很快用套接字解决这个问题