我正在尝试开发一个简单的LiveDateTime对象,该对象可靠、准确,并且在时间更新过程中与客户端系统日期无关。
我尝试过几种解决方案:
setInterval()或setTimeout()每1000 or增加一秒钟。也尝试了一个自校正延迟回路。所有这些都不符合要求,或者是因为如果更改了客户端系统日期,它也会设置活动时间,或者仅仅是循环的延迟是不准确的,并且随着时间的推移而漂移。
所以,我决定上网搜索一些流行的网站,我想要的东西已经实现和工作。我偶然发现了这个格林威治标准时间示例,它可靠、准确,并且在某种程度上独立于客户机系统。如果更改系统的日期,则它们显示的日期不受影响。
在检查他们的代码时,我发现很难理解他们在做什么,我可以复制这些代码,因为要么他们的代码编写得很糟糕,要么我还不够先进,无法理解它。
我确实知道,他们对服务器使用AJAX调用(request.js)是为了某种目的(可能是服务器时间)。而且他们使用的是一个setInterval(func, 150)和很多其他的演示方法,我认为这些方法并不是实时功能的核心。
有人能帮我找出他们准确的生活时间的核心功能吗?如果我能搞清楚,从那以后我就很容易复制。
发布于 2015-03-20 11:09:56
该示例与服务器端语言相结合以获得服务器时间。时间由PHP直接写入JS,例如:
var ServerDSTCheck = new Date(parseFloat(1426849548940.7)).getTime();浮动1426849548940.7来自服务器,这就是它不受客户端计算机时间影响的原因。AJAX调用每隔一段时间返回相同的内容,以保持服务器时间,因此不能在客户端上造成混乱,并避免客户端滞后。
这就是你需要的基础。其余的代码是关于夏令节约,时区补偿和表示性的东西。
发布于 2015-03-20 11:11:33
据我所知,你想要JS的独立时钟,对吧?很简单:
当用户更改本地机器上的时间时,不会影响脚本,刷新脚本也会再次从服务器加载时间。
发布于 2015-03-25 15:50:50
由于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 );https://stackoverflow.com/questions/29117771
复制相似问题