BastenGao's Blog - Web, Rails, Ruby, Java

web 应用程序中,浏览器与服务器时间一致性问题


web 写于2013-01-12 , 最后修改 2013-01-12 13:03

在 web 应用中,浏览器与服务器时间不一致是很常见的。客户端的时间是不能做为时间依据的,时间通常是服务端的时间。 例如发邮件,假设 A 和 B 两人,A 的操作系统时间不准,比北京时间快了 8 分钟,A 给 B 发了封邮件,且时间使用的是 A 操作系统的时间, 然后 B 很快的收到邮件, B 看到的邮件时间为即将到来的 8 分钟后,结果 B 很可能认为自己穿越到时了未来。 所以统一使用服务端时间则不会出现此类问题。

如果 web 页面相对比较简单,且时间也是精确显示,也没有过多问题。例如微博中的,新发的微博的时间显示通常为相对时间(如 “5 分钟前”), 并且随着时间的流逝相对时间也要随之变化。但是客户端的时间是不能做为依据的,不能直接拿客户端的时间减去发微博的时间得到相对时间。

我想到了两种办法:

  • 第一种,实时获取服务端时间,比如 ajax 轮询方式获取服务端时间,然后再做处理。当然这种做法简单,但是比较笨。
  • 另一种,页面在服务端生成时在页面标记服务端时间,例如标记在 body 上 <body data-server-time="${now}">。 然后页面在浏览器加载时同样在页面标记客户端时间,同样可以标记在 body 上 <body data-client-time="${now}">, 最终得到 <body data-service-time="${now0} data-client-time="${now1}">。 我们认为服务端生成页面与客户端加载页面时间基本上是一致的, 中间的网络请求、游览器解析等时间可以忽略不计(如果对时间精度要求不是很高的情况下),那么可以得出客户端与服务端的时间差值。 不管客户端时间是什么(客户端总是有时间的),我们总可以根据差值推算出服务端时间,反之亦然。
上一篇 你好,世界
comments powered by Disqus
Fork me on GitHub