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:
![]()
$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
![]()
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:
![]()
// 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
![]()
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 :)
#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>";










