2009-11-14 18 views
12

Jak ustawić datę i uzyskać odliczanie w PHP? Na przykład, jeśli ustawię datę na 3 grudnia 2 po południu, będzie to oznaczać, ile dni i godzin pozostało.Odliczanie do daty PHP

Nie ma potrzeby wprowadzania danych przez użytkownika dla daty, ponieważ będzie ona zakodowana na stałe.

Dzięki.

Odpowiedz

34

Możesz użyć funkcji strtotime, aby uzyskać czas określonej daty, a następnie użyj czasu, aby uzyskać różnicę.

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

Pozostała kwota będzie liczbą pozostałych sekund. Następnie można podzielić tę liczbę, aby uzyskać liczbę dni, godziny, minuty, itd

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

Doskonałe, dziękuję – usertest

+0

Na dzień przed imprezą odliczanie odczytu 0, gdy chcę go przeczytać 1 ... gdzie mogę dodać +1? – Omar

+0

Ostrożnie, 1 dzień = 86400 sekund nie zawsze jest prawdą –

2

To nie jest tak trywialne jak odjęcie strtotime() rezultaty, ponieważ istnieją letni i czas byłby matematycznie poprawne, ale nie fizycznie. W każdym razie, dla tych celów należy użyć gmdate function(), która nie ma czasu letniego:

$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 pozwala na to:

$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

Pozwól mi bawić się tak:

$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..."; 

Spróbuj tego w swoim czasie wolnym ... :-)

UWAGA: nie ma testu if() do echo "Remaining...", tylko nie będziesz tego przetwarzać w przypadku, gdy $rem <= 0. Czyż nie?

0

Czy to odliczanie do końca semestru:

$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

użyciem roztworu @Izhar Aazmi, można to ustawić ładnie do wyświetlania, takie jak:

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

Mam nadzieję, że to pomaga ! To ładny czysty sposób lub wyświetlający odliczanie.

0

Dla osób poszukujących funkcję zdolną do obsługi większych i mniejszych przedział czasowy (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'; 
    } 
}