0

我想创建时钟,其时间由服务器初始化,然后使用以下代码继续客户端:

//initializing by server(ASP.NET):
<% var now=System.DateTime.Now; %>
var h=<%=now.Hour %>;
var m=<%=now.Minute %>;
var s=<%=now.Second %>;

//then client:
function startTime() {
   s++;
   if (s == 60) {
       s = 0;
       m++;
       if (m == 60) {
           m = 0;
           h++;
           if (h == 24)
               h = 0;
       }
   }
   m = checkTime(m);
   s = checkTime(s);
   h = checkTime(h);
   document.getElementById('clock').innerHTML = h + ":" + m + ":" + s;
   t = setTimeout(function () { startTime() }, 1000);
}

function checkTime(i) {

   if (i < 10) {
       if(i.toString().length<2)
           i = "0" + i;
   }
return i;
}
window.load = startTime();

但是时钟每 10 分钟就会迟到 5 秒。

我怎样才能防止这种延迟?

4

2 回答 2

1

setTimeout是不够精确的,不能做精确的计时。10ms即使没有其他事情发生,它也可以很容易地关闭。在很长一段时间内,这会扭曲你的时钟。

实现时钟的另一种方法是使用本机Date对象为您进行计算,依靠系统时钟,并且仅用于setTimeout直观地更新时间。

现在,由于setTimeout无法可靠地每秒更新您可以设置的时间,100ms因此它将尝试每秒更新 10 次。如果您的时间计算不是太繁重,这应该可以很好地工作。

查看规范以了解如何使用Datehttps ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date (Mozilla Firefox)

于 2013-07-25T10:02:54.343 回答
0

改用这个:

//initializing by server(ASP.NET):
<% var now=System.DateTime.Now; %>
var d=new Date();
var h=<%=now.Hour %>;
var m=<%=now.Minute %>;
var s=<%=now.Second %>;
var sec=d.getSeconds();

//then client:
function startTime() {

    var date = new Date();
    if (date.getSeconds() != sec) {
       sec = date.getSeconds();
       s++;
    }
   if (s == 60) {
       s = 0;
       m++;
       if (m == 60) {
           m = 0;
           h++;
           if (h == 24)
               h = 0;
       }
   }
   m = checkTime(m);
   s = checkTime(s);
   h = checkTime(h);
   document.getElementById('clock').innerHTML = h + ":" + m + ":" + s;
   t = setTimeout(function () { startTime() }, 100);
}

function checkTime(i) {

   if (i < 10) {
       if(i.toString().length<2)
           i = "0" + i;
   }
return i;
}
window.load = startTime();
于 2013-07-25T10:25:19.120 回答