php - 使用 hh :mm:ss countdown without jquery 的 unix 时间戳

标签 php javascript mysql

我不明白为什么几个小时的搜索让我两手空空。 情况是这样的:我的网站用户可以设置事件开始的日期和时间。该日期和时间作为时间戳存储在数据库中。我想为他们显示倒计时。所以,我查询数据库

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);
    }
}

http://jsfiddle.net/mmJQq/

这段代码有效。但是,正如我上面所写,我不知道是否应该更直接地将 php 变量 $timeToEvent 传递给脚本。有点烦人的是,在 javascript 将其更改为我想要看到的内容之前,实际秒数在跨度中出现了大约 1 秒。 (顺便说一句,我并不太关心这种情况下的准确性;我不介意时间漂移。)

最佳答案

你永远不会改变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 );

http://jsfiddle.net/ZWrqB/

正如评论者指出的那样,这并不完全可靠,因为 setInterval 不会准确每一秒可靠地触发一次,因此计时器的准确性会稍微偏离一点点直到页面刷新。更好的方法是存储倒计时的时间,然后每次函数触发时,计算与当前时间的偏移量并将该偏移量用于计时器显示。这个答案是一个很好的方法:https://stackoverflow.com/a/11336046/711902

关于php - 使用 hh :mm:ss countdown without jquery 的 unix 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15419992/

相关文章:

PHP/MySQL 简单连接不起作用

php - php sdk 中按前缀的 Azure 列表 Blob

javascript - 仅在选定的 ng-repeat 元素上调用函数

javascript - 数据中的负值未显示在 highcharts 折线图中

PHP/SQL 处理特殊字符(PHP 初学者)

mysql - 在 MySQL 上用逗号分隔字段计算流行标签

java - php中 undefined variable 名错误

PHP/MySQL 邻接表问题

php - 在我的新代码中对非对象执行 bind_param() 函数

javascript - 如何使用 react 以多步形式进行验证