如何将javascript倒计时与服务器时间同步

smd*_*ger 19 javascript serverside-javascript

我正在建立一个有时间和价格的网站.我最关心的是同步时间,以便在所有客户端尽可能准确.

目前,我正在向客户端发送剩余的毫秒数,然后用于为倒数计时器提供燃料,但由于传输和渲染延迟,即使在同一台计算机上有2个浏览器,也可能会关闭几秒钟.

有没有办法同步客户端的javascript时间和服务器时间,或者我只是要处理这种轻微的延迟?

如果只有一种方法可以准确地测量发送数据的服务器与客户端接收和呈现数据之间的时差.

til*_*ryj 23

即使服务器和客户端上的时间不同,时间变化的速率也应基本相同.我会将剩余时间发送到客户端,然后让客户端将该时间添加到当前时间,然后让客户端计算倒计时.例如:

var timeRemaining = [rendered on page load or queried by ajax]; // in milliseconds
var endTime = new Date(new Date().getTime() + timeRemaining);

// Put this in a setInterval, or however you currently handle it
var countdown = (endTime.getTime() - new Date().getTime()) / 1000;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您在页面加载时填充timeRemaining,则有时页面将由Web浏览器缓存,如果您的用户离开页面并通过后退按钮返回该页面,则将呈现此缓存版本.在这种情况下,计时器似乎根本没有移动(因为timeRemaining仍保持缓存且未更改).真的很棘手. (6认同)

Dav*_*aun 15

有一种方法可以将客户端与服务器的时间同步.我写了一个这样做的库:ServerDate.

这是自述文件的一部分:

您可以ServerDate像使用Date函数或其中一个实例一样使用,例如:

> ServerDate()
"Mon Aug 13 2012 20:26:34 GMT-0300 (ART)"

> ServerDate.now()
1344900478753

> ServerDate.getMilliseconds()
22
Run Code Online (Sandbox Code Playgroud)

还有一种新方法可以获得ServerDate估计服务器时钟的精度(以毫秒为单位):

> ServerDate.toLocaleString() + " ± " + ServerDate.getPrecision() + " ms"
"Tue Aug 14 01:01:49 2012 ± 108 ms"
Run Code Online (Sandbox Code Playgroud)

您可以看到服务器的时钟和浏览器时钟之间的差异,以毫秒为单位:

> ServerDate - new Date()
39
Run Code Online (Sandbox Code Playgroud)