复制此实时核心功能


Replicating this Live Time core functionality

我正在尝试开发一个简单的LiveDateTime对象,它可靠、准确,并且在一定程度上独立于客户端系统日期,只要时间更新。

我尝试过几种解决方案:

  • 取服务器日期和与客户端系统日期的时间差来计算经过的时间,并每150ms更新一次时间。

  • 取客户端系统UTC日期,并用setInterval()setTimeout()每1000ms增加一秒。还尝试了一个自校正延迟环路。

  • 上面的一些类似变体。

以上所有内容都不符合要求,要么是因为如果客户端系统日期发生更改,也会设置实时时间,要么只是循环的延迟不准确,并随着时间的推移而偏离。

所以,我决定上网搜索一些流行的网站,这些网站已经实现了我想要的功能。我偶然发现了这个格林威治标准时间的例子,它可靠、准确,而且在某种程度上独立于客户端系统。如果我更改系统的日期,它们显示的日期将不受影响。

在检查他们的代码时,我发现很难理解他们在做什么,我可以复制,因为要么他们的代码写得不好,要么我不够先进,无法理解

我知道他们对服务器使用AJAX调用(request.js)是有原因的(可能是服务器时间)。他们使用的是setInterval(func, 150)和一大堆其他表示方法,我认为这些方法并不是实时功能的核心。

有谁能帮我弄清楚他们准确直播时间的核心功能吗?如果我能弄清楚这一点,那么我就很容易复制。

该示例与服务器端语言相结合,以获取服务器时间。时间由PHP直接写入JS,例如:

var ServerDSTCheck = new Date(parseFloat(1426849548940.7)).getTime();

这个浮点1426849548940.7来自服务器,这就是为什么它不受客户端机器时间的影响。AJAX调用每隔一段时间就会返回相同的东西,以保持服务器时间,这样它就不会在客户端上出错,也避免了客户端的滞后。

这是你需要的基础。代码的其余部分是关于夏令时、时区补偿和演示内容的。

据我所知,你想要JS中的独立时钟,对吧?很简单:

  1. 在用户加载脚本时,向服务器发出ajax请求,以获取当前时间(UNIX)
  2. 以1秒为例,设置间隔,然后根据您选择的间隔增加您的时间,即pt 1

当用户在本地机器上更改时间时,这不会影响脚本,刷新脚本也会再次从服务器加载时间。

由于js计时器在默认情况下非常不可靠,我认为您必须使用两个并行间隔。

一个是纠正前端相对于服务器时间的时间漂移,另一个是填补前端的空白(以免给服务器和用户的连接带来压力)。

var time = Date.now(); // Or initial server time
var oldTime = Date.now();
var newTime = oldTime;
var feInterval = setInterval( function() {
    // Incrementing "time" by whatever frontend difference, aka Delta time
    time += ( newTime = Date.now() ) - oldTime;
    oldTime = newTime;
 }, 40 );
var beInterval = setInterval( function() { 
    // Fetch server UTC milliseconds and overwrite "time".
    // Above interval will just use that as a new base time.
    var serverTime = Math.random() * 10000000000; //use Ajax to get server time.
    time = serverTime;
 }, 10000 );
setInterval( function() {
    // Do something with "time"
    // This interval is just for demo, you don't need it in general - use your own "time" consumer.
    console.log( 'Fairly correct time (random each 10 seconds):', new Date ( time ).toString() );
}, 40 );

我想还有其他人试图解决同样的问题,

查看下面的页面,

显示服务器时间,包括时区偏移