想要将 javascript 倒计时同步到服务器时间,而不是客户端时间

want to sync a javascript countdown to server time, not to client time

我希望我的时间为每个客户端(服务器时间)倒计时一次,而不是他们计算机上的时间。这是我的倒计时,我该怎么做?

这是一个计时器,应该为每个人倒计时到一个日期,这样周围的每个人都会看到计时器同时下降到 0。

        <script type="text/javascript">
        var ringer = {
          countdown_to: "07/20/2017 6:00 PM",
          rings: {
            'DAYS': { 
              s: 86400000, // mseconds in a day,
              max: 365
            },
            'HOURS': {
              s: 3600000, // mseconds per hour,
              max: 24
            },
            'MINUTES': {
              s: 60000, // mseconds per minute
              max: 60
            },
            'SECONDS': {
              s: 1000,
              max: 60
            }
           },
          r_count: 4,
          r_spacing: 10, // px
          r_size: 200, // px
          r_thickness: 30, // px
          update_interval: 11, // ms


          init: function(){

            $r = ringer;
            $r.cvs = document.createElement('canvas'); 

            $r.size = { 
              w: ($r.r_size + $r.r_thickness) * $r.r_count + ($r.r_spacing*($r.r_count-1)), 
              h: ($r.r_size + $r.r_thickness) 
            };



            $r.cvs.setAttribute('width',$r.size.w);           
            $r.cvs.setAttribute('height',$r.size.h);
            $r.ctx = $r.cvs.getContext('2d');
            $(".countdownwrap").append($r.cvs);
            $r.cvs = $($r.cvs);    
            $r.ctx.textAlign = 'center';
            $r.actual_size = $r.r_size + $r.r_thickness;
            $r.countdown_to_time = new Date($r.countdown_to).getTime();
            $r.cvs.css({ maxWidth: $r.size.w+"px", maxHeight: $r.size.h+"px",width: "90%", height: "19%"});
            $r.go();
          },
          ctx: null,
          go: function(){
            var idx=0;

            $r.time = (new Date().getTime()) - $r.countdown_to_time;


            for(var r_key in $r.rings) $r.unit(idx++,r_key,$r.rings[r_key]);      

            setTimeout($r.go,$r.update_interval);
          },
          unit: function(idx,label,ring) {
            var x,y, value, ring_secs = ring.s;
            value = parseFloat($r.time/ring_secs);
            $r.time-=Math.round(parseInt(value)) * ring_secs;
            value = Math.abs(value);

            x = ($r.r_size*.5 + $r.r_thickness*.5);
            x +=+(idx*($r.r_size+$r.r_spacing+$r.r_thickness));
            y = $r.r_size*.5;
            y += $r.r_thickness*.5;


            // calculate arc end angle
            var degrees = 360-(value / ring.max) * 360.0;
            var endAngle = degrees * (Math.PI / 180);

            $r.ctx.save();

            $r.ctx.translate(x,y);
            $r.ctx.clearRect($r.actual_size*-0.5,$r.actual_size*-0.5,$r.actual_size,$r.actual_size);

            // first circle
            $r.ctx.strokeStyle = "rgba(10,22,51, 1)";
            $r.ctx.beginPath();
            $r.ctx.arc(0,0,$r.r_size/2,0,2 * Math.PI, 2);
            $r.ctx.lineWidth =$r.r_thickness;
            $r.ctx.stroke();

            // second circle
            $r.ctx.strokeStyle = "rgba(23,149,210,1)";
            $r.ctx.beginPath();
            $r.ctx.arc(0,0,$r.r_size/2,0,endAngle, 1);
            $r.ctx.lineWidth =$r.r_thickness;
            $r.ctx.stroke();

            // label
            $r.ctx.fillStyle = "#fff";

            $r.ctx.font = '16px Helvetica';
            $r.ctx.fillText(label, 0, 40);


            $r.ctx.font = 'bold 80px Helvetica';
            $r.ctx.fillText(Math.floor(value), 0, 18);

            $r.ctx.restore();
          }
        }

        ringer.init();
    </script>

您使用的是什么服务器操作系统和网络服务器软件?

您可以向客户端发送具有初始化时间的页面,而不是在 JavaScript 中初始化时间,该时间在用户使用 PHP, but if you want the server to count down for you you would need to write an XML HttpRequest 请求页面以继续请求当前时间间隔。

您将要转换为服务器正在使用的任何时区(应该使用 UTC/GMT)。

function convertUTCToLocal(dateFromServer) {
    var now = new Date();
    return dateFromServer.setMinutes(dateFromServer.getMinutes - now.getTimezoneOffset());
}
var xmlHttp;
    function srvTime(){
    try {
        //FF, Opera, Safari, Chrome
        xmlHttp = new XMLHttpRequest();
    }
    catch (err1) {
        //IE
        try {
            xmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
        }
        catch (err2) {
            try {
                xmlHttp = new ActiveXObject('Microsoft.
            catch (eerr3) {
                //AJAX not supported, use CPU time.
                alert("AJAX not supported");
            }
        }
    }
                 xmlHttp.open('HEAD',window.location.href.toString(),false);
xmlHttp.setRequestHeader("Content-Type", "text/html");
xmlHttp.send('');
return xmlHttp.getResponseHeader("Date");
}

var st = srvTime();
var date = new Date(st);

我通过使用 Ajax

找到了您想要执行的解决方案