2017-02-21 6 views
0

Я столкнулся с проблемой рассчитать точную 5 минут от времени. Вот сценарий, с ответа сервера я получаю dateTime в формате YYYY-MM-DD HH:mm:ss после этого я показываю местный таймер на странице, который насчитывает 5 минут после этого времени. Я делаю это с помощью импульсов.счетчик точно 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 минут до начала счетчика даты считать от 5:13 или немного выше, это происходит, когда, например, данные из подсчета = '2017-02-22 00:30:50' и теперь дата = '2017-02-22 00:30:15' , Итак, как я могу избежать этой проблемы и показать местный счетчик точно 5:00 минут?

Мне нужно посчитать это с сервера, потому что мой счетчик зависит от специального события. И я должен показать, что каждый пользователь приходил на страницу одновременно с момента, когда у сервера есть ловушка. По местному пути каждый пользователь увидит собственный таймер с 5 минутами.

+0

Если вы хотите, чтобы ваш местный счетчик обратный отсчет времени составлял 5 минут в соответствии с местным временем, зачем вам нужно возвращать время со своего сервера? – bejado

+0

@bejado Я отредактировал мой вопрос – David

ответ

0

Хорошо, вот решение, которое соответствует моим потребностям.

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

Отключение лишних секунд просто. Просто вычислите свой объект diff (например, «5:13») и установите секунды на этом объекте на нуль, например, этот момент(). Seconds (0) ' – Vaclav

Смежные вопросы