首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >复制此实时核心功能

复制此实时核心功能
EN

Stack Overflow用户
提问于 2015-03-18 09:02:27
回答 4查看 167关注 0票数 1

我正在尝试开发一个简单的LiveDateTime对象,该对象可靠、准确,并且在时间更新过程中与客户端系统日期无关。

我尝试过几种解决方案:

  • 将服务器日期和与客户端系统日期之间的时间差计算出经过的时间,并相应地每150 to更新一次。
  • 获取客户端系统UTC日期,并使用setInterval()setTimeout()每1000 or增加一秒钟。也尝试了一个自校正延迟回路。
  • 上面的一些类似的变体。

所有这些都不符合要求,或者是因为如果更改了客户端系统日期,它也会设置活动时间,或者仅仅是循环的延迟是不准确的,并且随着时间的推移而漂移。

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

在检查他们的代码时,我发现很难理解他们在做什么,我可以复制这些代码,因为要么他们的代码编写得很糟糕,要么我还不够先进,无法理解它。

我确实知道,他们对服务器使用AJAX调用(request.js)是为了某种目的(可能是服务器时间)。而且他们使用的是一个setInterval(func, 150)和很多其他的演示方法,我认为这些方法并不是实时功能的核心。

有人能帮我找出他们准确的生活时间的核心功能吗?如果我能搞清楚,从那以后我就很容易复制。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-20 11:09:56

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

代码语言:javascript
复制
var ServerDSTCheck = new Date(parseFloat(1426849548940.7)).getTime();

浮动1426849548940.7来自服务器,这就是它不受客户端计算机时间影响的原因。AJAX调用每隔一段时间返回相同的内容,以保持服务器时间,因此不能在客户端上造成混乱,并避免客户端滞后。

这就是你需要的基础。其余的代码是关于夏令节约,时区补偿和表示性的东西。

票数 2
EN

Stack Overflow用户

发布于 2015-03-20 11:11:33

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

  1. 在用户加载脚本时,向服务器发出ajax请求,以获得当前时间(UNIX)。
  2. 设置间隔(例如1秒),并增加您在pt 1中所选择的时间间隔。

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

票数 1
EN

Stack Overflow用户

发布于 2015-03-25 15:50:50

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

一种是纠正前端与服务器时间之间的时间漂移,另一种则是填补前端上的空白(以免使服务器和用户连接紧张)。

代码语言:javascript
复制
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 );
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29117771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档