2010-06-24 261 views
5

¿Cómo obtengo una cuenta regresiva con PHP?Cómo mostrar la cuenta regresiva usando PHP y MySQL

Quiero mostrar algo así como 3Days 4Hours. Tengo un campo de fecha proveniente de la tabla MySQL y quiero calcularlo con la fecha de hoy. A partir de ahora solo tengo fecha y no el tiempo almacenado en la base de datos, pero eventualmente lo haré. Entonces, en ese momento, podría mostrarme como 3Days 4Hours 10Minutes 43seconds.

Esto es lo que he intentado, pero estoy recibiendo alguna respuesta incorrecta:

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

estoy confundido si esto funciona basado del tiempo del servidor o en la zona donde el usuario está viniendo. Por favor guíame. Cuando tengo el campo de tiempo, supongo que podría necesitar jQuery para mostrar los segundos en vivo y los minutos también.

+0

Su llamada a 'date()' 'de $ datetime2' es superfluo y lo incorrecto, podría ser este el problema? Además, ¿qué clase de respuesta incorrecta recibes? – deceze

+0

Cuando dices 'mostrar los segundos en vivo' ... ¿quieres decir que quieres que se actualice en tiempo real? –

+0

tienes razón, esa podría ser la razón. Lo siento, no puedo obtener el resultado incorrecto también, probablemente modifiqué otras cosas. Estaba leyendo tu otra respuesta, pero parece que la eliminaste, ¿por qué? – Jay

Respuesta

3

En mi humilde opinión, cuando estás pensando en comparar el tiempo, automáticamente empiezas a hablar en tiempo de Unix. Básicamente, el tiempo de Unix es un conteo en segundos que siempre se incrementa. Cuando tiene 2 marcas de tiempo de Unix, puede usar aritmética simple para calcular la diferencia y luego traducir la diferencia a una forma legible por humanos.

Tenga en cuenta que las marcas de tiempo Unix son comunes en casi todos los lenguajes de programación, para que pueda elegir si hacer esto en PHP, MySQL o JavaScript y todo lo que podría resultar de la misma manera. Te mostraré la versión de PHP.

Así que quieres hacer esto:

  1. Encuentra la fecha Unix para su evento de destino
  2. tienda que en la base de datos MySQL
  3. recuperar de la base de datos
  4. Obtener la fecha Unix actual
  5. Reste llegar diferencia
  6. Multiplicar/dividen para obtener el formato legible por humanos

El código 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!" 
} 
0

No es 100% respondiendo a su pregunta, sino una forma manual para hacerlo sería la siguiente:

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

A partir de ahí sólo tiene que formatearlo, y se puede encontrar un algoritmo in this answer.

0

Bueno, creo que si llamas a date() en el servidor, obtendrás la fecha y la zona horaria del servidor. Sin embargo, puede forzar la zona horaria con la función date_default_timezone_set([TIMEZONE]);, si eso es una preocupación.

Si estuviera haciendo esto, y quisiera una cuenta regresiva segundo a segundo, probablemente pasaría el intervalo calculado a javascript y dejaría que jQuery hiciera el formateo, especialmente si quiere un contador activo.

Por lo demás, se puede descargar todo el asunto a Javascript, y pasarlo las dos fechas, y el uso de date1.getTime() - date2.getTime() para obtener la diferencia de tiempo en milisegundos, y hacer lo mismo matemáticas en javascript (esto se cribbed de this answer)

Eso es probablemente cómo lo haría, si lo estuviera alterando en JS de todos modos.

1

PHP usará la zona horaria establecida por el servidor, que se puede establecer manualmente en su secuencia de comandos usando date_default_timezone_set(). Puede hacerlo de dos maneras:

Puede utilizar su consulta MySQL para hacer el cálculo por usted. Consulte la función TimeDiff(): http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_timediff. Luego, puede usar TimeFormat() para formatearlo como lo desee.

O bien, puede hacerlo a través de PHP. Puede convertir a formato unix epoch -> como una fecha. La otra opción sería comenzar con dos objetos DateTime como lo ha hecho. Proveedores:

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

O procesalmente:

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

Además, si desea mostrar el contador como una actualización en tiempo real mostrador; es probable que tengas que pasar esto a una función de Javascript más tarde.

1

Como mencionaste jQuery, es posible hacerlo solo con JavaScript si te parece bien.

jQuery plugin de cuenta atrás y ejemplo de trabajo: http://keith-wood.name/countdown.html

le ahorrará realización de llamadas a su base de datos también.

Cuestiones relacionadas