Odmierzanie ilości czasu do określonej datySkrypty PHP, mySQLDokładny czas do określonej daty
Często chcemy by nasza strona pokazywała bardzo szczegółowo czas do określonej daty - na przykład:
Jak posługiwać się artykułem?
Artykuł:
Opis funkcji ZwrocStringOpisujacyCzasDoWydarzenia
Co robi funkcja ZwrocStringOpisujacyCzasDoWydarzenia
Kluczem naszego programu jest funkcja PHP ZwrocStringOpisujacyCzasDoWydarzenia zadeklarowana jak poniżej:
function ZwrocStringOpisujacyCzasDoWydarzenia ($data_wydarzenia) { }Jej argumentem jest string (tekst) zawierający datę wydarzenia ($data_wydarzenia) w formacie jak poniżej: 'Rok-Miesiąc-Dzień Godzina:Minuta:Sekunda' na przykład $data_wydarzenia może mieć wartość: '2030-06-17 14:36:29' co oznacza 17 czerwca 2030 roku godzina 14 minut 36 i 29 sekund. Funkcja ZwrocStringOpisujacyCzasDoWydarzenia zwraca nam tekst (string) opisujący czas pozostały do wydarzenia zawartego w zmiennej $data_wydarzenia na przykład: lat: 18, miesięcy: 11, dni: 2, godzin: 6, minut: 41, sekund: 26 co oznacza, że do daty zawartej w zmiennej $data_wydarzenia pozostało 18 lat, 11 miesięcy, 2 dni, 6 godzin, 41 minut i 26 sekund. Data aktualna
By obliczyć różnicę między datą aktualna a datą zawartą w zmiennej $data_wydarzenia potrzebujemy pobrać aktualną datę w formacie identycznym jak data zawarta w zmiennej $data_wydarzenia. Funkcja PHP Date umożliwia pobrania daty w dowolnym formacie. Dlatego wywołujemy funkcję Date w sposób następujący:
$data_aktualna = Date('Y-m-d H:i:s');Oznacza to, że:
Liczba sekund od 1 stycznia 1970 roku
Funkcja PHP StrToTime oblicza ile minęło sekund od 1 stycznia 1970 roku. Nazwę tej funkcji można rozwinąć na Str To Time czyli Zamień String Na Czas. W ten sposób zamieniamy datę na liczbę sekund jaka upłynęła między podaną datą a 1 stycznia 1970.
Dlatego teraz tworzymy dwie zmienne które obliczają ile sekund upłynęło od 1 stycznia 1970 roku dla obydwu naszych dat: $liczba_sekund_dla_wydarzenia = StrToTime($data_wydarzenia); $liczba_sekund_dla_aktualnej_daty = StrToTime($data_aktualna); Co jeśli data wydarzenia już minęła?
Możemy teraz obliczyć ile sekund dzieli datę aktualna i wydarzenie ($liczba_sekund_miedzy_datami):
$liczba_sekund_miedzy_datami = $liczba_sekund_dla_wydarzenia - $liczba_sekund_dla_aktualnej_daty; if ($liczba_sekund_miedzy_datami<=0) return "";Jeśli różnica w sekundach między datami jest ujemna to znaczy, że termin wydarzenia upłynął i zwracam pusty tekst (pusty string) co również kończy działanie naszej funkcji. Różnica lat między datami
Mamy liczbę sekund między datami (zmienna $liczba_sekund_miedzy_datami). Jednak nas na początek interesuje liczba lat między datami. Zwróćmy uwagę, że liczba sekund w roku to:
iczba_dni_w_roku * liczb_godzin_w_dniu * liczba_minut_w_godzinie * liczba_sekund_w minucie czyli 365 * 24 * 60 * 60 Powyższej wartości nie będziemy liczyć (po co się męczyć skoro mamy komputery!) tylko zapamiętamy w zmiennej $liczba_sekund_w_roku. Zauważmy tu pewną słabość naszego programu. Nie uwzględnia on lat przestępnych które maja 366 dni. Teraz wystarczy podzielić $liczba_sekund_miedzy_datami przez $liczba_sekund_w_roku by mieć liczbę lat między datami (zapamiętamy jako $liczba_lat). Otrzymamy ułamek. Jeśli do wydarzenia pozostało pół roku (0,5) to oczywiście jest to 0 pełnych lat jaka pozostała do wydarzenia. Dlatego otrzymaną liczbę lat zaokrąglimy w dół korzystając z fukcji PHP Floor. Pełny kod realizujący powyższe zadania znajduje się poniżej: $liczba_sekund_w_roku = 365*24*60*60; $liczba_lat = Floor ($liczba_sekund_miedzy_datami/$liczba_sekund_w_roku); if ($liczba_lat > 0) $string_liczba_lat = "lat: $liczba_lat, "; else $string_liczba_lat = "";Ostatnie 4 linijki to przygotowanie tekstu (jako zmiennej $string_liczba_lat) gotowego do wyświetlenia na ekranie pokazującego liczbę lat pozostałych do wydarzenia. Jeśli liczba lat jest zero to nie będziemy wyświetlać żadnego tekstu. Liczba miesięcy
Na ekranie pokażemy ile jest miesięcy do wydarzenia po odjęciu liczby lat między wydarzeniami. Dlatego musimy w zmiennej $pozostała_liczba_sekund_miedzy_datami obliczyć liczbę sekund między datami ale po odjęciu liczby lat (w sekundach). Pozostała część kodu jest identyczna jak dla obliczenia różnicy lat.
Ponownie zauważmy, że przyjęliśmy, iż miesiąc ma 30 dni co jest pewnym zaokrągleniem. Cały kod liczący liczbę miesięcy pokazany jest poniżej: $liczba_sekund_w_miesiacu = 30*24*60*60; $pozostała_liczba_sekund_miedzy_datami = $liczba_sekund_miedzy_datami - $liczba_lat*$liczba_sekund_w_roku; $liczba_miesiecy = Floor($pozostała_liczba_sekund_miedzy_datami/$liczba_sekund_w_miesiacu); if ($liczba_miesiecy > 0) $string_liczba_miesiecy = "miesięcy: $liczba_miesiecy, "; else $string_liczba_miesiecy = ""; Liczba dni, godzi, minut
Pozostałe dni, godziny, minuty obliczamy w identyczny sposób jak liczbę miesięcy:
$liczba_sekund_w_dniu = 24*60*60; $pozostała_liczba_sekund_miedzy_datami = $pozostała_liczba_sekund_miedzy_datami - $liczba_miesiecy*$liczba_sekund_w_miesiacu; $liczba_dni = Floor($pozostała_liczba_sekund_miedzy_datami/$liczba_sekund_w_dniu); if ($liczba_dni > 0) $string_liczba_dni = "dni: $liczba_dni, "; else $string_liczba_dni = ""; $liczba_sekund_w_godzinie = 60*60; $pozostała_liczba_sekund_miedzy_datami = $pozostała_liczba_sekund_miedzy_datami - $liczba_dni*$liczba_sekund_w_dniu; $liczba_godzin = Floor($pozostała_liczba_sekund_miedzy_datami/$liczba_sekund_w_godzinie); if ($liczba_godzin > 0) $string_liczba_godzin = "godzin: $liczba_godzin, "; else $string_liczba_godzin = ""; $liczba_sekund_w_minucie = 60; $pozostała_liczba_sekund_miedzy_datami = $pozostała_liczba_sekund_miedzy_datami - $liczba_godzin*$liczba_sekund_w_godzinie; $liczba_minut = Floor($pozostała_liczba_sekund_miedzy_datami/$liczba_sekund_w_minucie); if ($liczba_minut > 0) $string_liczba_minut = "minut: $liczba_minut, "; else $string_liczba_minut = ""; Liczba sekund
Liczby sekund nie musimy jakoś specjalnie obliczać. Jest to pozostała ilość sekund po obliczeniu minut.
Dodatkowo liczbę sekund pokazujemy zawsze. Dlaczego?
$liczba_sekund = $pozostała_liczba_sekund_miedzy_datami - $liczba_minut*$liczba_sekund_w_minucie; $string_liczba_sekund = "sekund: $liczba_sekund"; Zwracamy czas do wydarzenia
Nadeszła pora by nasza funkcja PHP zwróciła tekst określający ile pozostało czasu do wydarzenia.
Najpierw wszystkie zmienne zawierające tekst (string) określający liczbę lat, miesięcy, dni, godzin, minut i sekund łączymy w jedną zmienną $string_czas_do_wydarzenia. W języku PHP do łączenia tekstów (stringów) służy kropka. Dlaczego łączymy teksty w dwóch linijkach? Dla zwiększenia czytelności tekstu (przydaje się w edytorze tekstowym). Teraz wystarczy tekst $string_czas_do_wydarzenia opisujący dokładną ilość czasu do wydarzenia zawartego w zmiennej $data_wydarzenia po prostu zwrócić do funkcji nadrzędnej. $string_czas_do_wydarzenia = $string_liczba_lat . $string_liczba_miesiecy . $string_liczba_dni; $string_czas_do_wydarzenia .= $string_liczba_godzin . $string_liczba_minut . $string_liczba_sekund; return $string_czas_do_wydarzenia; Jak wykorzystać naszą funkcję?
Napisaliśmy właśnie funkcję ZwrocStringOpisujacyCzasDoWydarzenia, która zwraca nam tekst (string) opisujący czas pozostały do określonego wydarzenia zawartego w zmiennej $data_wydarzenia. Jak ją wykorzystać?
Definiujemy datę wydarzenia
Przede wszystkim musimy zdefiniować datę wydarzenia. Może to być na przykład 17 czerwca 2030 roku godzina 14 minut 36 i 29 sekund.
Musimy tylko pamiętać by był zachowany format daty, to znaczy kreski, spacja, dwukropki: 'Rok-Miesiąc-Dzień Godzina:Minuta:Sekunda' jak poniżej: $data_wydarzenia = '2030-06-17 14:36:29'; Tekst opisujący czas do wydarzenia
Teraz możemy wykorzystać naszą funkcję ZwrocStringOpisujacyCzasDoWydarzenia, która zwróci nam tekst (string) opisujący czas do zmiennej $data_wydarzenia. My ten tekst zapamiętamy w zmiennej $string_czas_do_wydarzenia.
jak poniżej:
$string_czas_do_wydarzenia = ZwrocStringOpisujacyCzasDoWydarzenia ($data_wydarzenia); Co zrobić z tekstem opisującym czas do wydarzenia?
Na to pytanie musimy sobie odpowiedzieć sami.
Przede wszystkim musimy wiedzieć co oznacza dla nas zdefiniowana powyżej data 17 czerwca 2030 roku godzina 14 minut 36 i 29 sekund zapisana w zmiennej $data_wydarzenia. Niech to będzie na przykład koniec promocji.
Założymy, że po prostu chcemy na ekranie wypisać tekst informujący o czasie do końca promocji. Wówczas najprościej zrobić to następująco: if ($string_czas_do_wydarzenia=="") echo 'Czas promocji już minął...<br />'; else echo 'Do końca promocji pozostało już tylko ' . $string_czas_do_wydarzenia . '<br />';Jeśli funkcja ZwrocStringOpisujacyCzasDoWydarzenia zwróciła pusty string (tekst) to oznacza, że nasza data jest późniejsza niż czas promocji i promocja się skończyła. Wypisujemy tą informację korzystając z funkcji echo języka PHP. W przeciwnym wypadku (dzisiejsza data jest wcześniejsza niż koniec promocja czyli promocja trwa) wypisujemy na ekranie tekst informujący o czasie do końca promocji. Znaczki oznaczają dodatkowe spacje uwypuklające nasz tekst opisujący szczegółowo ilość czasu do końca promocji (zmienna $string_czas_do_wydarzenia). Czy musi być statycznie?
Nasz program ma jedną właściwość. Po załadowaniu się strony pokazywany czas do końca naszej promocji nie aktualizuje się. Czyli raz wyświetlony tekst na przykład:
Do końca promocji pozostało już tylko lat: 18, miesięcy: 11, dni: 2, godzin: 6, minut: 41, sekund: 26będzie trwał na ekranie aż użytkownik odświeży stronę lub otworzy ją ponownie. Można temu łatwo zaradzić wpisując w nagłówku strony polecenie dla przeglądarki by odświeżała stronę co pewnie czas na przykład co 5 sekund: <meta http-equiv="Refresh" content="5" />Zamiast piątki, możemy wstawić dowolna inna liczbę definiującą co ile sekund przeglądarka ma ponownie załadować stronę. Wadą tego podejścia jest fakt, że za każdym razem cała strona jest ładowana ponownie. Dla ciężkich stron lub przy wolnym łączu może to być słabe. Jeśli chcemy by tylko tekst z liczbą dni do wydarzenia się odświeżał to PHP ani klasyczny html się nie nadaje. Musimy wówczas skorzystać z języka JavaScript. Jednak i JavaScript ma swoje wady. Nie wszyscy użytkownicy mają włączoną obsługę JavaScript A jeśli ma być statycznie?
Wówczas wystarczy, że z nagłówka strony www po prostu usuniemy linijkę:
<meta http-equiv="Refresh" content="5" /> Plik z kodem programu
Wyżej omówiony program (kod) możesz pobrać tutaj w postaci pliku php gotowego do umieszczenia w serwisie www. Poniżej znajduje się link do pełnego pliku zawierającego kod programu który wyświetla pozostały czas do określonej daty (17 czerwca 2030 roku godzina 14 minut 36 i 29 sekund) wykorzystując funkcję ZwrocStringOpisujacyCzasDoWydarzenia. Jest to strona www (spakowana programem zip) gotowa do umieszczenia w serwisie www - na przykład celem testów, modyfikacji, itp.
Powyższy plik wystarczy rozpakować i jako plik PHP umieścić w serwisie wwww. Program od razu będzie wyświetlał liczbę godzin do określonej daty (17 czerwca 2030 roku godzina 14 minut 36 i 29 sekund).
Cały kod programu?
Poniżej znajduje się listing powyższego programu w postaci pełnej, przykładowej strony www wyświetlająca dokładny czas do końca pewnej promocji (17 czerwca 2030 roku godzina 14 minut 36 i 29 sekund).
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Serwis ABC</title> <meta http-equiv=content-type content="text/html; charset=iso-8859-2"> <meta http-equiv="Content-Language" content="pl"> <meta http-equiv="Refresh" content="5" /> </head> <body> <?php $data_wydarzenia = '2030-06-17 14:36:29'; $string_czas_do_wydarzenia = ZwrocStringOpisujacyCzasDoWydarzenia ($data_wydarzenia); if ($string_czas_do_wydarzenia=="") echo 'Czas promocji już minął...<br />'; else echo 'Do końca promocji pozostało już tylko &&&&' . $string_czas_do_wydarzenia . '<br />'; ////////////////////////////////////////////////////////////////////// /// Funkcja ZwrocStringOpisujacyCzasDoWydarzenia ($data_wydarzenia) /// //Funkcja zwraca string (tekst) opisujacy czas pozostały do okreslonego //wydarzenia zawartego w zmiennej $data_wydarzenia //Jesli $data_wydarzenia jest wczesniejsza niż data aktualna to fukcja //zwraca pusty string czyli "". //Argument $data_wydarzenia powinie byc postaci: // Rok-Miesiąc-Dzień Godzina:Minuta:Sekunda //na przykład // '2030-06-17 14:36:29' //co oznacza // 17 czerwca 2030 roku godzina 14 minut 36 i 29 sekund //Funkcja zwróci string opisujący dokładny czas pozostały do daty //$data_wydarzenia, na przykład: // lat: 18, miesięcy: 11, dni: 2, godzin: 6, minut: 41, sekund: 26 ////////////////////////////////////////////////////////////////////// function ZwrocStringOpisujacyCzasDoWydarzenia ($data_wydarzenia) { $data_aktualna = Date('Y-m-d H:i:s'); $liczba_sekund_dla_wydarzenia = StrToTime($data_wydarzenia); $liczba_sekund_dla_aktualnej_daty = StrToTime($data_aktualna); $liczba_sekund_miedzy_datami = $liczba_sekund_dla_wydarzenia - $liczba_sekund_dla_aktualnej_daty; if ($liczba_sekund_miedzy_datami<=0) return ""; $liczba_sekund_w_roku = 365*24*60*60; $liczba_lat = Floor ($liczba_sekund_miedzy_datami/$liczba_sekund_w_roku); if ($liczba_lat > 0) $string_liczba_lat = "lat: $liczba_lat, "; else $string_liczba_lat = ""; $liczba_sekund_w_miesiacu = 30*24*60*60; $pozostała_liczba_sekund_miedzy_datami = $liczba_sekund_miedzy_datami - $liczba_lat*$liczba_sekund_w_roku; $liczba_miesiecy = Floor($pozostała_liczba_sekund_miedzy_datami/$liczba_sekund_w_miesiacu); if ($liczba_miesiecy > 0) $string_liczba_miesiecy = "miesięcy: $liczba_miesiecy, "; else $string_liczba_miesiecy = ""; $liczba_sekund_w_dniu = 24*60*60; $pozostała_liczba_sekund_miedzy_datami = $pozostała_liczba_sekund_miedzy_datami - $liczba_miesiecy*$liczba_sekund_w_miesiacu; $liczba_dni = Floor($pozostała_liczba_sekund_miedzy_datami/$liczba_sekund_w_dniu); if ($liczba_dni > 0) $string_liczba_dni = "dni: $liczba_dni, "; else $string_liczba_dni = ""; $liczba_sekund_w_godzinie = 60*60; $pozostała_liczba_sekund_miedzy_datami = $pozostała_liczba_sekund_miedzy_datami - $liczba_dni*$liczba_sekund_w_dniu; $liczba_godzin = Floor($pozostała_liczba_sekund_miedzy_datami/$liczba_sekund_w_godzinie); if ($liczba_godzin > 0) $string_liczba_godzin = "godzin: $liczba_godzin, "; else $string_liczba_godzin = ""; $liczba_sekund_w_minucie = 60; $pozostała_liczba_sekund_miedzy_datami = $pozostała_liczba_sekund_miedzy_datami - $liczba_godzin*$liczba_sekund_w_godzinie; $liczba_minut = Floor($pozostała_liczba_sekund_miedzy_datami/$liczba_sekund_w_minucie); if ($liczba_minut > 0) $string_liczba_minut = "minut: $liczba_minut, "; else $string_liczba_minut = ""; $liczba_sekund = $pozostała_liczba_sekund_miedzy_datami - $liczba_minut*$liczba_sekund_w_minucie; $string_liczba_sekund = "sekund: $liczba_sekund"; $string_czas_do_wydarzenia = $string_liczba_lat . $string_liczba_miesiecy . $string_liczba_dni; $string_czas_do_wydarzenia .= $string_liczba_godzin . $string_liczba_minut . $string_liczba_sekund; return $string_czas_do_wydarzenia; } ?> </body> </html> Przykładowy efekt działania programu
Poniżej przykład działania naszego kodu pokazującego szczegółowo ilość czasu do końca promocji:
![]() Używaj kodu dowolnie
Kod zawarty w tym artykule możesz wykorzystywać dowolnie, bez żadnych zastrzeżeń. Jedyna prośba to umieszczenie linku do niniejszej strony:
http://www.cauchy.pl/systemy/php-mysql/odmierzanie-ilosci-czasu-do-okreslonej-daty/ na przykład w formie jak poniżej: <a href="http://www.cauchy.pl/systemy/php-mysql/odmierzanie-ilosci-czasu-do-okreslonej-daty/">Program i gotowa funkcja w języku PHP odmierzająca dokładny czas do określonej daty</a>
Poszperaj w serwisie cauchy.pl lub w sieci. | ![]() ![]() ![]() |
| korepetycje z języka polskiego |