Cauchy - Szkoła Myślenia www.cauchy.pl//systemy/php-mysql/odmierzanie-ilosci-czasu-do-okreslonej-daty/     |     Dodaj do ulubionych11 grudzień 2019

Łamigłówki podstawowa

|

Przedszkolaki

|

Kolorowanki

|

Rebusy

|

Krzyżówki

|

Wykreślanki

|

Algorytmy

|

Zabawy

Korepetycje, korepetycje z języka polskiego

Poprzednie PoprzednieDo góry, menu nadrzędne, lista zadań Lista wszystkich tematówNastępne Następne

Odmierzanie ilości czasu do określonej daty

Skrypty PHP, mySQL

Dokł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:
  • końca promocji
  • dnia urodzin
  • zaćmienia słońca
  • ...
Dzięki temu artykułowi będziesz mógł wyświetlić swój własny tekst z dokładnym czasem pozostałym do ważnego dla Ciebie wydarzenia. W wyświetlanym na ekranie tekście będzie zawarta liczba
  • lat
  • miesięcy
  • dni
  • godzin
  • minut
  • sekund
pozostałych do wydarzenia.
Jak posługiwać się artykułem?
Artykuł:
  1. Na początku opisuje funkcję w języku PHP zwracającą tekst (string) opisujący czas pozostały do określonej daty.
    Tę funkcję możesz skopiować i wkleić do własnego programu i wykorzystywać dowolnie.
  2. Pokazuje sposób wykorzystania opisanej funkcji.
  3. Na końcu dokumentu znajdziesz pełną, przykładową stronę www wraz z kodem PHP odmierzającym dokładny czas do końca pewnej fikcyjnej promocji.
    Strona ta wykorzystuje wcześniej napisaną funkcję.
    Możesz tą stronę wkleić do swojego serwisu, testować, zmieniać, dostosować do swoich potrzeb.
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:
  • Rok, miesiąc i dzień będą oddzielone myślnikami (-)
  • Rok będzie wyświetlany w postaci 4 znaków (Y)
  • Miesiąc będzie wyświetlany w postaci 2 znaków (m)
  • Dzień będzie wyświetlany w postaci 2 znaków (d)
  • Po spacji będzie wyświetlana godzina jako 2 znaki w formacie 24 godzinnym (H)
  • Po dwukropku będzie wyświetlana minuta jako 2 znaki (i)
  • Po dwukropku będą wyświetlane sekundy jako 2 znaki (s)
Wszystko fajnie, tylko my potrzebujemy nie dwie daty a różnicę w godzinach między dwiema datami.
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:
  1. Definiujemy ile jest sekund w dniu (lub godzinie, minucie)
  2. Znajdujemy pozostałą jeszcze liczbę sekund po uwzględnieniu dotychczas obliczonych liczby lat, miesięcy,...
  3. Obliczamy liczbę dni (lub godzin, minut) do wydarzenia dzieląc pozostałą liczbę sekund przez ilość sekund w dniu (lub godzinie, minucie)
  4. Definiując tekst (string) określający pozostałą liczbę dni (lub godzin, minut) do wydarzenia o ile dana liczba jest większa od 0.
 $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?
  1. Tekst (string): sekund 0 nie będzie nikogo raził
  2. Wcześniejsze informacje (na przykład minut: 23,) kończyły się przecinkiem. Głupio by było zostawić przecinek jako ostatni znak. Dlatego lepiej jest pokazać sekundy które nie kończymy żadnych znakiem interpunkcyjnym gdyż na pewno będzie to ostatnia informacja o czasie do wydarzenia.
 $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 &nbsp; 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: 26
 
bę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:
Szczegółowe odmierzanie czasu do okireślonej daty.
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>

PoprzednieDo góry, menu nadrzędne, lista zadańNastępne
PoprzednieLista wszystkich tematówNastępne


Nie znalazłeś szukanej treści?
Poszperaj w serwisie cauchy.pl lub w sieci.
Google
 
Matury z lat 2002 - 2005. Zadania, rozwiązania zadań, schemat punktacji
 

Newsletter

Tak, chcę otrzymywać bezpłatny newsletter:

Imię:

Email:

 
Internetowe kursy maturalne z matematyki
 
Kurs przygotowujący do sprawdzianu szóstoklasisty z matematyki
 
(C) 2010 Szkoła Myślenia im. A. L. Cauchy        Napisz Napisz        Praca     Reklama
   korepetycje z języka polskiego