我不明白为什么几小时的搜索让我空手而归。 情况是这样的:我的网站用户可以设置事件开始的日期和时间。该日期和时间作为时间戳存储在数据库中。我想为他们显示一个倒计时。所以,我查询db
SELECT TIMESTAMPDIFF(SECOND, NOW(), start)
FROM events
WHERE eid = '110';
返回事件设置为开始之前剩余的秒数。我想要的是能够在span
中输出天数,小时数,分钟数和数量。秒。
这是我到目前为止的javascript:
阅读完评论,搜索更多内容,并将一些内容混合在一起后,这是我更新的代码:
<span id="countdown-1"><?php echo $timeToEvent; ?></span>
(如果有更合适的方法来获取脚本的“秒'直到事件”值,请更正我。)
secs = parseInt(document.getElementById('countdown-1').innerHTML,10);
setTimeout("countdown('countdown-1',"+secs+")", 1000);
function countdown(id, timer){
function pad(num) {
return num > 9 ? num : '0'+num;
};
timer--;
days = Math.floor( timer / 86400 ),
hours = Math.floor( timer / 3600 ),
mins = Math.floor( timer / 60 ),
secs = Math.floor( timer ),
dd = days,
hh = hours - days * 24,
mm = mins - hours * 60,
ss = secs - mins * 60;
clock = dd + ' days ' + pad(hh) + ':' + pad(mm) + ':' + pad(ss) ;
document.getElementById(id).innerHTML = clock;
if ( timer > 0 ) {
setTimeout("countdown('" + id + "'," + timer + ")", 1000);
} else {
window.location.reload(true);
}
}
此代码有效。但是,正如我上面所写,我不知道我是否应该将php变量$timeToEvent
更直接地传递给脚本。稍微恼人的是,在javascript将其更改为我想要查看的内容之前,实际秒数在跨度中出现约1秒。 (顺便说一下,我并不过分担心这种情况下的准确性;我不介意时间漂移。)
答案 0 :(得分:2)
你永远不会改变diff
。每次运行该函数时,它仍然是相同的值。将diff
移到函数外部,然后在每次函数运行时将其递减1000毫秒(1秒)。
var
diff = 3850000; // Move this outside the function so that it can be changed.
// If you don't, it will get reset to its original value
// every time updateETime runs.
function updateETime() {
function pad(num) {
return num > 9 ? num : '0'+num;
};
days = Math.floor( diff / (1000*60*60*24) ),
hours = Math.floor( diff / (1000*60*60) ),
mins = Math.floor( diff / (1000*60) ),
secs = Math.floor( diff / 1000 ),
dd = days,
hh = hours - days * 24,
mm = mins - hours * 60,
ss = secs - mins * 60;
document.getElementById("countdown_time")
.innerHTML =
dd + ' days ' +
pad(hh) + ':' + //' hours ' +
pad(mm) + ':' + //' minutes ' +
pad(ss) ; //+ ' seconds' ;
diff -= 1000; // Every time the function runs, subtract one second from diff.
}
setInterval(updateETime, 1000 );
正如评论者指出的那样,这并不完全可靠,因为setInterval
每隔一秒就不能可靠地 ,所以你的计时器的准确性会一点一点地消失,直到页面刷新。更好的方法是将时间存储到倒计时,然后每次函数触发时,计算当前时间的偏移量并将该偏移量用于计时器显示。这个答案是一个很好的方法:https://stackoverflow.com/a/11336046/711902
答案 1 :(得分:0)
时间是静态的,因为时间是静态的。
在您的函数updateETime()
中,显示变量diff
,细分为天,小时,分钟和秒。但由于diff
永远不会改变,因此显示也不会改变。
如果您想要显示倒计时,则每次拨打diff
时都必须递减updateETime()
。