2017-02-21 7 views
0

私は時間から正確に5分を計算する問題に直面しました。ここでシナリオは、サーバーの応答から私はの形式でYYYY-MM-DD HH:mm:ssを取得した後、その時間の5分後にカウントするページにローカルタイマーを表示します。私はmomentjsとそれを行う。正確に日付から5分

var output = document.getElementById('out'); 
 

 
var fromCount = '2017-02-22 00:23:50'; 
 
var toMins = moment(fromCount).add(5, 'minutes'); 
 
var toMinsCount = setInterval(function(){ 
 
    var now = moment(); 
 
    var diff = moment(toMins - now).format('mm:ss'); 
 
    if(diff==='00:00'){ 
 
    clearInterval(toMinsCount); 
 
    // something more here 
 
    output.innerText = 'times up change fromCount data time'; 
 
    } 
 
    if(now>toMins){ 
 
    clearInterval(toMinsCount); 
 
    output.innerText = 'change fromCount data time'; 
 
    } else { 
 
    output.innerText = diff; 
 
    } 
 
},1000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script> 
 

 
<div id="out"></div>

すべてが素晴らしく動作しますが、私は日付のカウンターに5分を追加したときに、時にはときのカウントから例えばデータは= '2017-02-22 00:30:50'、今日付= '2017-02-22 00:30:15'それが発生し、5:13またはビット上位からカウントを開始。では、どうすればこの問題を回避し、正確に5:00分のローカルカウンターを表示できますか?

私のカウンターは特別なイベントに依存しているので、サーバーの時間から数える必要があります。そして、私は、各ユーザがサーバが捕まった瞬間から同じ時間にページを表示するようになったことを示すべきである。地元の方法では、各ユーザーは自分の5分タイマーを見るでしょう。

+0

ローカルカウンターを現地時間に合わせて5分カウントダウンするには、サーバーから何時間も返す必要があるのはなぜですか? – bejado

+0

@bejado私の質問 – David

答えて

0

[OK]を、ここにソリューションを提供します。

function count5min(value) { 
    $http.get('https://testfate.ru/time').then(function (resp) { 
     // getting dateTime fromServer 

     var realTime, toMins, diff; 

     realTime = moment(resp.data.time).valueOf(); 
     diff = moment().valueOf() - realTime; 

     var beforeStart = moment(value); 

     toMins = moment(beforeStart).add(5, 'minutes'); 

     var toMinsCount = setInterval(function() { 
     var now = moment().subtract(diff, 'milliseconds'); 
     var difference = moment(toMins - now).format('mm:ss'); 
     if (difference === '00:00') { 
      clearInterval(toMinsCount); 
     } 
     if (now > toMins) { 
      clearInterval(toMinsCount); 
     } else { 
      $(el).find('.short-timer').text(difference); 
     } 
     }, 1000); 

    }, function (err) { 
     console.error(err); 
    }); 
    } 

は、だから私は何をすべきかで、サーバーから時刻を取得し、その後、インターバル機能で現地時間のこの違いを引く、ミリ秒で現地時間とサーバー時間の違いを発見しました。私の魅力のように動作します。私の友人は私にこのアイデアを提案します。

0

サーバーとクライアントの時間が異なる可能性があります。これらのサーバーとクライアントは同期されません。サーバーが応答するたびに、またはサーバーからではなく、カウントダウンの制限をサーバーから送信するたびに、5分の制限をカウントします。自分のニーズに合った

var limit = 5 * 60 // 5 minutes × 60 seconds 
 
    , output = document.getElementById("theFinalCountdown") 
 
    , interval = setInterval(function() { 
 
     if (limit === 0) { 
 
      clearInterval(interval); 
 
     } else { 
 
      output.textContent = // innerText is WRONG, use textContent 
 
       moment.unix(limit).format("mm:ss"); 
 
     } 
 
     limit--; 
 
    }, 1000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script> 
 
<div id="theFinalCountdown"></div>

+0

を編集しました** ...またはあなたのサーバーからカウントダウンの制限を送信します**これは後でやろうとします。しかし、今、5分を追加する必要がある時間から余分な秒をカットする方法があります。ミリ秒単位で変換時間を計算し、5分> 05:00を追加した後の時間が余分である場合はどうなるでしょうか – David

+0

余分な秒をカットするのは簡単です。あなたの日付差分オブジェクトを計算して(例えば、結果は '5:13')、そのオブジェクトの秒を0に設定します。それは 'moment()。seconds(0)' – Vaclav

関連する問題