CompZone.Org :: Artykuły :: PHP
Jaki jest Twój wiek?
40 - 59
26 - 39
19 - 25
13 - 18
12 i mniej
60 i więcej
Sonda Wyniki

Add to Google

Obliczanie czasu pozostałego do podanej daty

Często w skryptach musimy obliczyć ile czasu zostało do określonego wydarzenia w przyszłości. Niniejszy artykuł przedstawia w jaki sposób to zrobić oraz wyjaśnia niektóre istotne funkcje związane z czasem i datą.

Witam!

W tym tekście dowiecie się jak działa skrypt obliczający ile czasu pozostało do określonej daty. Skrypt ten dostępny jest tutaj". W artykule znajdziecie również opis wykorzystanych funkcji oraz obliczeń. Jednym słowem analiza kodu linijka po linijce :)

Uwaga:
Przedstawiony poniżej listing pozbawiony jest komentarzy i notek.

Kod PHP:

 <?php
$dzien = 7;
$miesiac = 11;
$rok = 07;

$kiedys = mktime('','','',$miesiac,$dzien,$rok);
$dzis = mktime();

$zostalo_s = $kiedys - $dzis;
$dni = floor($zostalo_s / (24*60*60));

$czas_p = mktime(23,59,59);

$rs = $czas_p - $dzis;
$h = floor($rs / (60*60));

$datat = date('H:i:s');
$tablica = explode(':', $datat);
$m = 60 - $tablica[1];

$s = 60 - $tablica[2];

echo 'Do '.$dzien.'.'.$miesiac.'.'.$rok.'r. zostalo: '.$dni.' dni, '.$h.' godzin '.$m.' minut '.$s.' sekund.';
?>

Analiza kodu

Linijki: 2,3,4
Ustawiamy datę dla której będziemy obliczać ilość pozostałych dni, godzin, minut, sekund, oraz przypisujemy do odpowiednich zmiennych.

Linijka 2 - dzień, liczby od 1 do xx (xx max liczba dni w miesiącu).
Linijka 3 - miesiąc, liczby od 1 do 12.
Linijka 4 - rok, format dwu- lub czterocyfrowy (wartości dwucyfrowe od 0 do 69 zostaną zinterpretowane jako lata od 2000 do 2069, a wartości od 70 do 99 jako lata od 1970 do 1999).

Linijka 6 - konwersja ustalonej powyżej daty do znaczniku czasu unixa.
Wykorzystano tu funkcje mktime, która pobiera 6 podstawowych parametrów.

Prototyp funkcji mktime

 <?php 
int mktime(int godzina, int minuta, int sekunda, int miesiac, int dzień, int rok, [, int czas letni])
?>

Należy pamiętać aby nie pominąć parametrów czasu, jeżeli nie są one ważne nadajemy im wartość zero, natomiast jeśli zostawimy je puste tak jak uczyniłem to w linijce 6 automatycznie zostaną pobrane wartości aktualne.

Można natomiast pominąć parametry z prawej strony, czyli zapis:

 <?php
// niepoprawny - pominięto parametry czasu
$kiedys = mktime($miesiac,$dzien,$rok);
//poprawny - parametry czasu przyjmą wartości aktualne
$kiedys = mktime('','','',$miesiac,$dzien,$rok);
//poprawny - parametry daty przyjmą wartości aktualne
$kiedys = mktime($godzina,$minuta,$sekunda);
?>

Należy jeszcze wyjaśnić co to jest znacznik czasu uniksa, jest to liczba sekund, która upłynęła od 1 stycznia 1970 GMT.

Linijka 7 - pobiera aktualną datę, czas i zamienia na znacznik czasu. unixa, czyli zapis ten oznacza ile sekund upłynęło od 1 stycznia 1970 do teraz.

Linijka 9 - zwykłe działanie matematyczne, skoro mamy dwie daty w znaczniku czasu unixa to możemy je odjąć i otrzymamy ilość sekund, która pozostała do ustalonej daty.

Linijka 10 - kolejne działanie matematyczne, tym razem zamiana sekund na dni :) oraz zaokrąglenie tego wyniku przy użyciu funkcji floor (piekny opis polecam się zapoznac :P)

Linijka 12 - ustawienie znacznika czasu unixa na północ.
Linijka 14 - obliczenei róznicy sekund w danym dniu.
Linijka 15 - zamiana sekund na godziny oraz zaokrąglenie.

Linijka 17 - ustawieni aktualnego czasu w formacie GG:MM:SS, odsyłam do manuala świetnie opisana funkcja date

Linijka 18 - użycie funkcji explode do rozdzielenia daty na godziny, minuty, sekundy. W dalszej części zostaną użyte jedynie wartości minut i sekund.

Jak działa funkcja explode?

Funkcja pobiera ciąg, w naszym przypadku jest to $datat i rozbija go na części według separatora, w naszym przypadku jest to ":]", po czym zwraca części w postaci tablicy. Tutaj zwróci tablice trójelementową.

Prototyp funkcji explode

 <?php
array explode(string separator, string wpis [int limit])
?>

Parametr opcjonalny limit pozwala nam ograniczyć ilość części tablicy.

Linijka 19 - obliczenie pozostałych minut
Linijka 21 - obliczenie pozostałych sekund
inijka 23 - wyświetlenie wyników :)

jedre @ 30-06-2006 12:17

#1

Skrypt niestety posiada duży błąd. Wyliczana poprawnie jest jedynie liczba dni. Godziny i minuty są błędne liczony. Wynika to z faktu, iż w linijce 14 odejmujemy czas obecny od północy a nie od $kiedys (czyli zadanego czasu do którego odmierzamy czas). Co z tego wynika? Mianowicie to, że nie zależnie jaką będziemy podawali zadaną godzinę i minutę, wynik zawsze będzie ten sam i będzie różnicą od godziny 23:59:59 (linijka 12) a nie od zadanego czasu. Poniżej przedstawiam poprawiony przeze mnie i sprawdzony kod, działający tak jak powinien: $dzien = $wiersz['dzien']; $miesiac = $wiersz['miesiac']; $rok = $wiersz['rok']; $godzina = $wiersz['godzina']; $minuta = $wiersz['minuta']; $sekunda = 00; $data_start = mktime($godzina,$minuta,$sekunda,$miesiac,$dzien,$rok); $teraz = mktime(); $zostalo = $data_start - $teraz; $dni = floor($zostalo / (24*60*60)); $godzin = floor(($zostalo / (60*60))-($dni*24)); $minut = floor($zostalo / 60)-($dni*24*60)-($godzin*60); echo "start za: <strong>"; if ($dni>0) { echo $dni." dni; "; } else {} if ($godzin>0) { echo $godzin." godz. ";} else {} echo $minut." min.</strong>";

mef123 @ 10-05-2008 13:38
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!