从日期算起精确 5 分钟

问题描述 投票:0回答:3

我遇到了计算精确 5 分钟时间的问题。这里的场景是,从服务器响应中我得到格式为

dateTime
YYYY-MM-DD HH:mm:ss
,之后我在页面上显示本地计时器,该计时器在该时间之后计数 5 分钟。我用 momentjs 来做。

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
或更高一点开始计数时,例如来自 count =
'2017-02-22 00:30:50'
的数据,现在日期 =
'2017-02-22 00:30:15'
时,就会发生这种情况。那么我怎样才能避免这个问题并显示本地计数器精确的
5:00
分钟?

我需要从服务器时间开始计算,因为我的计数器取决于特殊事件。我应该显示从服务器捕获那一刻起每个用户同时进入页面。以本地方式,每个用户都会看到自己的 5 分钟计时器。

javascript momentjs
3个回答
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
投票

好的,这是适合我需求的解决方案。

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
投票
var now = new Date();
var second = now.getSeconds();
var minute = now.getMinutes();
var hour = now.getHours();

if(second == 0 && [0,5,10,15,20,25,30,35,40,45,50,55,60].filter(x => x == minute).length > 0){
    console.log("ok")
}
© www.soinside.com 2019 - 2024. All rights reserved.