服务器日期的一面JavaScript时钟

我有一项任务是在某个固定时区(MSK或MSD - 取决于当前日期)在HTML页面上显示数字时钟(精确到分钟)。 我想避免依赖客户端系统时钟,因此需要与服务器进行一些同步。 HTTP服务器在每个响应中发送Date标头,以便我们可以向我们网站的任何URL发送AJAX GET或HEAD请求以获取服务器日期,计算与客户端日期的差异,并在使用setTimeout()更新时钟时使用它。 还有其他一些问题:日光设置的时区切换,连接速度非常慢的延迟会计。

任何想法到这个任务最简单的方式? 我宁愿在没有服务器端编程的情况下解决它。


如果你打算使用ajax,你应该记住readyState == 2和readyState == 3之间的客户端时间,因为服务器时间将根据请求接收和响应准备之间的某个时间设置


这两个Javascript函数应该为你做窍门。

var offset = 0;
function calcOffset() {
    var xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    xmlhttp.open("GET", "http://stackoverflow.com/", false);
    xmlhttp.send();

    var dateStr = xmlhttp.getResponseHeader('Date');
    var serverTimeMillisGMT = Date.parse(new Date(Date.parse(dateStr)).toUTCString());
    var localMillisUTC = Date.parse(new Date().toUTCString());

    offset = serverTimeMillisGMT -  localMillisUTC;
}

function getServerTime() {
    var date = new Date();

    date.setTime(date.getTime() + offset);

    return date;
}

编辑:删除“.replace(/ ^(。)[ s S] /,”$ 1“)”。

calcOffset()计算服务器时间的偏移量并补偿GMT / UTC。

getServerTime()使用本地时区获取本地时间偏移量以匹配服务器。

如果calcOffset()需要时间来执行,则可能会失去几秒钟的精度。 也许可以考虑执行时间....

如果您担心在本地时间或服务器时间更改为夏令时或从夏令时更改时计算出的偏移量错误,则您可以在每个时钟小时后重新计算一个小数点,系统将补偿日间节省时间的变化。 可能需要等到本地和服务器时钟都已经过了一个小时。

该示例仅适用于IE,因为“Msxml2.XMLHTTP”我认为.....


您可以使用代码中的NTP(网络时间协议)计算确切的时间,

我尝试为你解释:

  • 我们有发送请求的ClientTime(例如2012年4月3日13:56:10.123)
  • 您将ClientTime发送到服务器
  • 我们有往返时间的请求,我称它为RequestTime (例如:它需要5秒钟)
  • 在服务器中,我们计算服务器和客户端之间的差异时间(例如:It ServerTime - ClientTime = ServerClientDifferenceTimeWithRequestTime),您现在应该差异包括步骤3中的往返请求时间,然后您应该从差异中去除往返时间
  • 服务器发送包含ServerClientDifferenceTimeWithRequestTime和ServerTime的响应
  • 我们有响应的往返时间 ,我称之为ResponseTime (例如:需要3秒)
  • 在客户端,我们再次计算服务器和客户端之间的差异时间(例如:It ServerTime - ClientTime = ServerClientDifferenceTimeWithResponseTime),现在您应该在步骤6中包含往返响应时间的差异
  • 我们现在有时间在客户端
  • 你应该在客户端计算简单的方程式:
  • X(SyncedTime) = Now + (ServerClientDifferenceTimeWithRequestTime - RquestTime)

    X(SyncedTime) = Now + (ServerClientDifferenceTimeWithResponseTime - ResponseTime)

    Now - ClientTime = RquestTime + ResponseTime =>

    Now - (ServerClientDiffRq - RquestTime) = Now - (ServerClientDiffRs - ResponseTime)

    如果你解决它,你发现这一点:

    ResponseTime = (ServerClientDifferenceTimeWithRequestTime - Now + ClientTime + - ServerClientDifferenceTimeWithResponseTime )/2

    然后你可以在这个公式中找到客户端的同步时间或服务器时间:

    X(SyncedTime) = Now + (ServerClientDifferenceTimeWithResponseTime - ResponseTime)

    我显示简单的代码,但是当你想写它没有忘记使用UTC日期和时间函数...

    服务器端(例如php,c#):

    PHP:

    header('Content-Type: application/json; charset=utf-8');
    $clientTime = $_GET["ct"] * 1; //for php 5.2.1 or up: (float)$_GET["ct"];
    $serverTimestamp = round(microtime(true)*1000); // (new DateTime())->getTimestamp();
    $serverClientRequestDiffTime = $serverTimestamp - $clientTime;
    echo "{"diff":$serverClientRequestDiffTime,"serverTimestamp":$serverTimestamp}";
    

    C#:

    long clientTime = long.Parse(Request.Form["ct"]);
    long serverTimestamp = (DateTime.Now.Ticks-(new DateTime(1970,1,1) - DateTime.MinValue).Ticks) / 10000;
    long serverClientRequestDiffTime = serverTimestamp - clientTime;
    Response.Write("{"diff":"+serverClientRequestDiffTime+","serverTimestamp":"+serverTimestamp+"}");
    

    客户端(Javascript与JQuery):

    var clientTimestamp = (new Date()).valueOf();
    $.getJSON('http://yourhost.com/getdatetimejson/?ct='+clientTimestamp, function( data ) {
        var nowTimeStamp = (new Date()).valueOf();
        var serverClientRequestDiffTime = data.diff;
        var serverTimestamp = data.serverTimestamp;
        var serverClientResponseDiffTime = nowTimeStamp - serverTimestamp;
        var responseTime = (serverClientRequestDiffTime - nowTimeStamp + clientTimestamp - serverClientResponseDiffTime )/2
    
        var syncedServerTime = new Date((new Date()).valueOf() + (serverClientResponseDiffTime - responseTime));
        alert(syncedServerTime);
    });
    
    链接地址: http://www.djcxy.com/p/86161.html

    上一篇: side javascript clock with server date

    下一篇: side vs. server