如何使用PHP和MySQL显示时间倒计时

时间:2010-06-24 04:35:44

标签: php javascript jquery mysql date

如何使用PHP获得倒计时?

我想要显示像3Days 4Hours这样的东西。我有一个来自MySQL表的日期字段,想要用今天的日期来计算它。截至目前,我只有日期,而不是存储在数据库中的时间,但最终我会。所以在那个时候,我可能会将3D时间显示为4小时10分钟43秒。

这是我尝试的但是得到了错误的答案:

$datetime1 = new DateTime($starton);//$starton - date stored in db
$datetime2 = new DateTime(date());
$interval = $datetime1->diff($datetime2);
echo $interval->format('%d days);

如果这基于服务器时间或用户来自的区域,我感到很困惑。请指导我。当我有时间字段时,我想我可能需要jQuery来显示秒数和分钟数。

6 个答案:

答案 0 :(得分:3)

当你考虑比较时间时,恕我直言,你自动开始谈论Unix时间。从本质上讲,Unix时间是以秒为单位的计数,总是递增。如果你有2个Unix时间戳,那么你可以使用简单的算法来计算差异,然后将差异转换为人类可读的形式。

请注意,Unix时间戳在几乎所有编程语言中都很常见,因此您可以选择是在PHP,MySQL还是JavaScript中执行此操作,并且它们都可以采用相同的方式。我将向您展示PHP版本。

所以你想这样做:

  1. 查找目标事件的Unix时间戳
  2. 将其存储在MySQL数据库中
  3. 从数据库中检索
  4. 获取当前的Unix时间戳
  5. 减去差异
  6. 乘以/除以得到人类可读的格式
  7. PHP代码:

    //Unix timestamp to Dec. 21, 2012 (midnight)
    $unix_time = mktime(0,0,0,12,21,2012); 
    //Connect to MySQL
    //"INSERT INTO table (target_timestamp) VALUES ($unix_time);"
    
    
    //----- user goes to page -----
    //Connect to MySQL
    $sql = "SELECT target_timestamp FROM table WHERE foo = bar";
    $unix_time = do_query($sql);//do_query not defined, assume it gets the timestamp
    $current_time = time();
    $diff = $unix_time - $current_time
    //$diff should be positive and not 0
    if( 1 > $diff ){
       exit('Target Event Already Passed (or is passing this very instant)');
    } else {
       $w = $diff / 86400 / 7;
       $d = $diff / 86400 % 7;
       $h = $diff / 3600 % 24;
       $m = $diff / 60 % 60; 
       $s = $diff % 60;
    
       return "{$w} weeks, {$d} days, {$h} hours, {$m} minutes and {$s} secs away!"
    }
    

答案 1 :(得分:1)

PHP将使用服务器设置的时区,可以使用date_default_timezone_set()在脚本中手动设置。您可以通过以下几种方式实现这一目标:

您实际上可以使用MySQL查询为您进行计算。请参阅TimeDiff()功能:http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff。然后,您可以使用TimeFormat()将其格式化为您想要的格式。

或者你可以通过PHP完成它。你可以转换为unix epoch - >格式化为日期。另一种选择是从你做的两个DateTime对象开始。尝试:

$datetime1 = new DateTime($starton);
$datetime2 = new DateTime();
$interval = $datetime1->diff($datetime2);
echo $interval->format('%d days);

或程序上:

$datetime1 = date_create($starton);
$datetime2 = date();
$interval = date_diff($datetime1,$datetime2);
echo $interval->format('%d days');

另外,如果要将计数器显示为实时更新计数器;你可能不得不稍后将其交给Javascript函数。

答案 2 :(得分:1)

既然你提到了jQuery,那么就可以通过JavaScript来实现它,如果可以的话。

jQuery倒计时插件和工作示例: http://keith-wood.name/countdown.html

还可以节省您对数据库的调用。

答案 3 :(得分:0)

不是100%回答您的问题,但手动方式是:

$start = strtotime($dbTime);
$now = time();
$differenceInSeconds = $start - $now;

从那里你只需要格式化它,你就可以找到算法in this answer

答案 4 :(得分:0)

好吧,我想如果您在服务器上调用date(),那么您将获得服务器日期和时区。但是,如果这是一个问题,您可以使用函数date_default_timezone_set([TIMEZONE]);强制使用时区。

如果我这样做,并希望逐秒倒计时,我可能会将计算的间隔传递给javascript并让jQuery进行格式化,特别是如果你想要一个活跃的计数器。

就此而言,您可以将整个内容卸载到javascript,并将其传递给两个日期,并使用date1.getTime() - date2.getTime()来获取时间差(以毫秒为单位),并在javascript中自行完成数学运算(这是从this answer

如果我在JS中改变它,那么我可能会这样做。

答案 5 :(得分:0)

这是一个解决方案,一些框架(如Ruby on Rails)已经解决,PHP似乎不是其中之一,我认为你正在寻找的是:

http://www.phpro.org/examples/Convert-Seconds-To-Hours-Minutes-Seconds-Words.html