我遇到了计算精确 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 分钟计时器。
服务器和客户端的时间可能不同,它们不同步。每次服务器响应时,计数限制为 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>
好的,这是适合我需求的解决方案。
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);
});
}
所以我所做的是,从服务器获取时间,找到本地时间和服务器时间之间的差异(以毫秒为单位),然后在间隔函数中从本地时间中减去该差异。对我来说就像一个魅力。我的朋友向我建议了这个想法。
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")
}