Php 在不使用jquery的情况下使用unix时间戳进行hh:mm:ss倒计时

Php 在不使用jquery的情况下使用unix时间戳进行hh:mm:ss倒计时,php,javascript,mysql,Php,Javascript,Mysql,我不明白为什么几个小时的搜索让我两手空空。 情况是这样的:我的站点用户可以设置事件开始的日期和时间。该日期和时间作为时间戳存储在数据库中。我想为他们显示一个倒计时。因此,我查询数据库 SELECT TIMESTAMPDIFF(SECOND, NOW(), start) FROM events WHERE eid = '110'; 返回事件设置为开始前剩余的秒数。我想要的就是能够在span中输出天数、小时数、分钟数和秒数 以下是我到目前为止使用的javascript: 在阅读评论、搜索更多内

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

SELECT TIMESTAMPDIFF(SECOND, NOW(), start) 
FROM events 
WHERE eid = '110';
返回事件设置为开始前剩余的秒数。我想要的就是能够在
span
中输出天数、小时数、分钟数和秒数

以下是我到目前为止使用的javascript:

在阅读评论、搜索更多内容并将一些内容整合在一起之后,这是我的更新代码:

<span id="countdown-1"><?php echo $timeToEvent; ?></span>


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

时间是静态的,因为时间是静态的

在函数
updateETime()
中,显示变量
diff
,细分为天、小时、分钟和秒。但是由于
diff
从不改变,因此显示也不会改变


如果要显示倒计时,则必须递减
diff
,每次调用
updatetime()

时,您永远不会更改
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
不会准确地每一秒触发一次,因此计时器的准确性会逐渐消失,直到页面刷新为止。更好的方法是存储倒计时时间,然后每次函数启动时,计算当前时间的偏移量,并将该偏移量用于计时器显示。这是一个很好的解决方法:

最好从数据库中检索实际事件开始时间,并在更新代码的每次迭代中执行“剩余时间”计算。在函数中使用
diff=,
,因此每次调用函数时,它都会重置为该时间。您需要单独的函数来设置/倒计时“然后将其递减1000毫秒”不。实际上,我喜欢你关于ops问题的例子。在1000秒内或1000秒内都不会发生间隔(因此您不能依赖它)。一定要通过每个时间间隔的“未来点”-“现在”(新日期)计算您的差异。这是真的。我想让它和OP最初的尝试保持一致,这样他就可以很容易地判断出哪里出了问题。我应该补充更多,以帮助他更好地解决这个问题。谢谢你指出我头脑中掠过的简单问题。
  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 );