2011-04-29 54 views
0

我的問題是僅顯示客戶端時間,但希望每秒顯示服務器時間。如何每秒獲取服務器時間

function GetCount(ddate,iid){ 

var date = new Date(); 
dateNow = date; 

// if time is already past 
if(amount < 0){ 

} 
// else date is still good 
else{ 
    days=0;hours=0;mins=0;secs=0;out=""; 

    amount = Math.floor(amount/1000);//kill the "milliseconds" so just secs 

    days=Math.floor(amount/86400);//days 
    amount=amount%86400; 

    hours=Math.floor(amount/3600);//hours 
    amount=amount%3600; 

    mins=Math.floor(amount/60);//minutes 
    amount=amount%60; 

    secs=Math.floor(amount);//seconds 

    document.getElementById(iid).innerHTML=days; 
    document.getElementById('countbox1').innerHTML=hours; 
    document.getElementById('countbox2').innerHTML=mins; 
    document.getElementById('countbox3').innerHTML=secs; 

    setTimeout(function(){GetCount(ddate,iid)}, 1000); 
} 
} 

回答

3

如果你想避免所有的網絡流量每秒檢查一次服務器的時間,只需要:(1)讓服務器以一種在頁面加載時存儲JS變量的方式傳遞時間; (2)在頁面加載時也存儲客戶端時間; (3)使用setInterval通過獲取當前客戶端時間減去頁面加載時的客戶端時間作爲服務器頁面加載時間的偏移量來更新時間(每1000毫秒或按照您希望的頻率)。 (很明顯,如果用戶在你的頁面運行時更新他們的PC時鐘,但是有多少用戶會這樣做,並且如果他們這麼做會是世界末日?)

如果你真的想要每秒的實際服務器時間 - 爲什麼?似乎有點浪費帶寬,如果有任何好處,但如果您必須按照已經建議的那樣使用Ajax。如果您對Ajax不熟悉,我會建議使用Google來查找一些教程 - 如果您使用JQuery,則只需使用幾行代碼即可完成。簡單。

或將您的屏幕時鐘放在一個反覆重新加載的IFRAME中。僅僅因爲我有時會錯過IFRAME的日子。

0

你需要你的服務器供應時間爲JavaScript,或者在頁面加載或通過XMLHttpRequest。

0

要從JavaScript中的客戶端獲取服務器時間,您需要進行ajax調用。 你知道如何進行這種類型的呼叫嗎?

你基本上會做另一個頁面(或網絡方法等),它顯示/返回時間。然後您將使用XMLHttpRequest對象進行調用並獲得結果。

2

如果您遇到服務器時間與客戶端時鐘不同的問題,我會在幾分鐘內查找一次服務器時間增量,然後將其添加到新Date()的分鐘數中:

var refDateTime = new Date(); 
    refDateTime.setMinutes(refDateTime.getMinutes() + getServerTimeDelta()); 
    // ... 
    var serverTimeDelta; 
    function getServerTimeDelta(recalc) { 
     var xmlHttp; 
     if (recalc || !serverTimeDelta) { 
      try { 
      if (window.XMLHttpRequest) { 
       xmlHttp = new XMLHttpRequest(); 
      } else { 
       xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); 
      } 
      } catch(err1) { 
      //IE 
      try { 
       xmlHttp = new ActiveXObject('Msxml2.XMLHTTP'); 
      } catch(err2) { /* swallow it */ } 
      } 
      if (xmlHttp) { 
      xmlHttp.open('HEAD', window.location.href.toString(), false); 
      xmlHttp.setRequestHeader("Content-Type", "text/html"); 
      xmlHttp.send(''); 
      var serverDateTime = xmlHttp.getResponseHeader("Date"); 
      if (serverDateTime) { 
       var dateNow = new Date(); 
       var serverDate = new Date(serverDateTime); 
       var delta = serverDate.getTime() - dateNow.getTime(); 
       // Convert to minutes 
       serverTimeDelta = parseInt((delta/60000) + ''); 
       if (!serverTimeDelta) serverTimeDelta = 0.01; 
       } else { 
       serverTimeDelta = 0.011; // avoid auto recalc 
       } 
      } else { 
      serverTimeDelta = 0.012; 
      } 
     } 
     return serverTimeDelta; 
    } 
相關問題