2011-04-29 15 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を使用する場合は、2行のコードで済ませることができます。簡単です。

または、自分自身を繰り返しリロードするIFRAMEにオンスクリーンの時計を入れます。ちょうどIFRAMEの時代を逃すことがあるからです。

0

ページロード時またはXMLHttpRequest経由でJavaScriptに時刻を入力するには、サーバーが必要です。

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; 
    } 
関連する問題