2009-11-14 15 views
12

¿Cómo se puede establecer una fecha y obtener una cuenta regresiva en PHP? Por ejemplo, si configuro la fecha como 3 de diciembre a las 2 p.m. me dirá cuántos días y horas quedan.PHP Cuenta atrás para la fecha

No hay necesidad de entradas de usuario para la fecha, ya que será difícil codificar.

Gracias.

Respuesta

34

Puede utilizar la función strtotime para obtener la hora de la fecha especificada, luego use el tiempo para obtener la diferencia.

$date = strtotime("December 3, 2009 2:00 PM"); 
$remaining = $date - time(); 

$ restantes serán la cantidad de segundos restantes. A continuación, puede dividir ese número para obtener el número de días, horas, minutos, etc.

$days_remaining = floor($remaining/86400); 
$hours_remaining = floor(($remaining % 86400)/3600); 
echo "There are $days_remaining days and $hours_remaining hours left"; 
+2

Excelente, gracias – usertest

+0

En el día antes del evento la cuenta atrás leer 0 cuando lo quiero para leer 1 ... ¿dónde agrego el +1? – Omar

+0

Cuidado, 1 día = 86400 segundos no siempre es cierto –

2

No es tan trivial como restando strtotime() resultados, ya que hay cambios de horario y tiempo sería matemáticamente correcto, pero no físicamente la función de todos modos, a estos efectos se debe utilizar gmdate(), que no tiene horario de verano:

$date = gmdate('U', strtotime('2009-12-03 14:00')); 

// Get difference between both dates without DST 
$diff = $date - gmdate('U'); 
// Days (in last day it will be zero) 
$diff_days = floor($remaining/(24 * 60 * 60)); 
// Hours (in the last hour will be zero) 
$diff_hours = floor($remaining % (24 * 60 * 60)/3600); 
6

PHP 5.3 permite esto:

$dt_end = new DateTime('December 3, 2009 2:00 PM'); 
$remain = $dt_end->diff(new DateTime()); 
echo $remain->d . ' days and ' . $remain->h . ' hours'; 
16

Déjame jugar alrededor de la siguiente manera:

$rem = strtotime('2012-08-01 14:00:00') - time(); 
$day = floor($rem/86400); 
$hr = floor(($rem % 86400)/3600); 
$min = floor(($rem % 3600)/60); 
$sec = ($rem % 60); 
if($day) echo "$day Days "; 
if($hr) echo "$hr Hours "; 
if($min) echo "$min Minutes "; 
if($sec) echo "$sec Seconds "; 
echo "Remaining..."; 

Pruebe esto en su tiempo libre ... :-)

NOTA: No hay prueba if() para echo "Remaining...", simplemente porque no procesará esto en el caso cuando $rem <= 0. ¿No es así?

0

hizo esto cuenta atrás hasta el final del semestre:

$endOfSemester = mktime(15,30,0,5,21,2015); 
    $now = time(); 
    $secondsRemaining = $endOfSemester - $now; 

    define('SECONDS_PER_MINUTE', 60); 
    define('SECONDS_PER_HOUR', 3600); 
    define('SECONDS_PER_DAY', 86400); 

    $daysRemaining = floor($secondsRemaining/SECONDS_PER_DAY); //days until end 
    $secondsRemaining -= ($daysRemaining * SECONDS_PER_DAY); //update variable 

    $hoursRemaining = floor($secondsRemaining/SECONDS_PER_HOUR); //hours until end 
    $secondsRemaining -= ($hoursRemaining * SECONDS_PER_HOUR); //update variable 

    $minutesRemaining = floor($secondsRemaining/SECONDS_PER_MINUTE); //minutes until end 
    $secondsRemaining -= ($minutesRemaining * SECONDS_PER_MINUTE); //update variable 

    echo("<h3>There are $daysRemaining days, $hoursRemaining hours, $minutesRemaining minutes, $secondsRemaining seconds until the end of the semester</h3>"); //print message 
0

Utilizando la solución @Izhar Aazmi, podría configurar esta muy bien para la visualización, tales como:

public function countdown($time, $h = true, $m = true, $s = true) { 
     $rem = $time - time(); 
     $day = floor($rem/86400); 
     $hr = floor(($rem % 86400)/3600); 
     $min = floor(($rem % 3600)/60); 
     $sec = ($rem % 60); 

     if ($day && !$h) { 
      if ($hr > 12) $day++; // round up if not displaying hours 
     } 

     $ret = Array(); 
     if ($day && $h) $ret[] = ($day ? $day ." day".($day==1?"":"s") : ""); 
     if ($day && !$h) $ret[] = ($day ? $day . " day" . ($day == 1 ? "" : "s") : ""); 
     if ($hr && $h) $ret[] = ($hr ? $hr ." hour" . ($hr==1?"":"s") : ""); 
     if ($min && $m && $h) $ret[] = ($min ? $min ." minute". ($min==1?"":"s") : ""); 
     if ($sec && $s && $m && $h) $ret[] = ($sec ? $sec ." second".($sec==1?"":"s") : ""); 

     $last = end($ret); 
     array_pop($ret); 
     $string = join(", ", $ret)." and {$last}"; 

     return $string; 
    } 

Espero que esto ayude ! Es una forma agradable y limpia o muestra la cuenta regresiva.

0

Para aquellos que buscan una función capaz de manejar lapso de tiempo mayor y menor (php> 5,3):

/** 
* Return a textual representation of the time left until specified date 
*/ 
function timeleft(DateTime $date){ 
    $now = new DateTime(); 

    if($now > $date){ 
    return '0 second'; 
    } 

    $interval = $date->diff($now); 

    if($interval->y){ 
    return $interval->format("%y year").($interval->y > 1 ? 's':''); 
    } else if($interval->m){ 
    return $interval->format("%m month").($interval->m > 1 ? 's':''); 
    } else if($interval->d){ 
    return $interval->format("%d day").($interval->d > 1 ? 's':''); 
    } else if($interval->h){ 
    return $interval->format("%h hour").($interval->h > 1 ? 's':''); 
    } else if($interval->i){ 
    return $interval->format("%i minute").($interval->i > 1 ? 's':''); 
    } else if($interval->s) { 
    return $interval->format("%s second").($interval->s > 1 ? 's':''); 
    } else { 
    return 'milliseconds'; 
    } 
} 
Cuestiones relacionadas