[PHP] Jak policzyć ile zostało lub minęło lat, dni, godzin, minut i sekund względem określonej daty?
Chcesz pokazać na stronie ile czasu zostało do określonej daty lub ile czasu minęło od określonej daty. Można w ten sposób odliczać czas pozostały do końca roku, pokazywać ile lat istnieje Twój serwis, etc.
Przykład:
od teraz do 2002.04.24 - 13:53:11 mineło:
lat: 2; dni: 751; godzin: 18034; minut: 1082060; sekund: 64923625
lub
lat: 2; dni: 21; godzin: 10; minut: 20; sekund: 25
Skrypt jest uniwersalny - umożliwia podanie jedynie ilości lat, dni lub godzin (np. zostało 876 dni) albo pokazanie różnicy czasu w bardziej czytelnym formacie (np. zostało jeszcze 18 dni, 21 godzin i 30 sekund).
Bardzo łatwo możesz zmodyfikować sposób pokazywania różnicy czasu, co pozwala stosować skrypt w zasadzie do wszystkich możliwych przeliczeń względem aktualnego lub określonego dnia. Zobacz jak policzyć i pokazać różnicę czasu:
$teraz=gmmktime(); // aktualna data
$dzien=gmmktime(13,53,11,04,24,2002); // 2002.04.24 - 13:53:11
// wyliczanie roznicy
$sekund = abs($teraz-$dzien);
$minut = (int)($sekund/60);
$godzin = (int)($minut/60);
$dni = (int)($godzin/24);
$lat = (int)($dni/365);
// wyliczanie calego okresu
$sekund = (int)($sekund-$minut*60);
$minut = (int)($minut-$godzin*60);
$godzin = (int)($godzin-$dni*24);
$dni = (int)($dni-$lat*365);
echo "lat: $lat; dni: $dni; godzin: $godzin; minut: $minut; sekund: $sekund";
Zmienna teraz pobiera i przechuje aktualny czas w sekundach. Zmienna dzien pobiera czas również w sekundach, ale dla określonego przez nas dnia. Dla określonego dnia należy podać po kolei: godzinę, minutę, sekundę, miesiąc, dzień i rok.
Teraz wystarczy obliczyć różnicę czasu między datami. W wyniku otrzymamy liczbę sekund, z której można policzyć różnicę w innych jednostkach czasu. Funkcja abs() podaje wartość bezwzględną (ujemną zamienia na dodatnią), a więc nie trzeba się martwić tym, że data z przyszłości wyszłaby ujemna.
Dzieląc sekundy, a potem poszczególne jednostki obliczamy minuty, godziny, dni i lata. Typ int odrzuca wartość po przecinku, ponieważ interesują nas pełne lata, godziny lub minuty.
Możnaby już teraz wypisać, ile dni mineło od podanej daty, jednak wartość "875 dni" lub "7262543 sekund" jest mało czytelna. Dobrze jest zamienić wszystko na pełne dni, godziny lub minuty. Dlatego w drugim "bloku obliczeniowym" ponownie przeliczamy czas aby uzyskać wersję z czytelnymi jednostkami.
Teraz wystarczy wypisać wynik na ekran. Przetestuj program dla daty z przeszłości i przyszłości - działa bardzo dobrze. Jedyne co musisz zrobić to podać datę w programie i na stronie poinformować użytkownika względem jakiej daty obliczasz różnicę.
Funkcje czasu zaczynają się od przyrostka gm (gmmktime) mają one identyczne znaczenie jak mktime, ale uwzględniają zmiany godzin w czasie letnim i zimowym. Gdyby nie one, wyliczenia w niektórych wypadkach byłyby obarczone błędem wynikającym z dodania godziny i jej odjęcia dwa razy w roku. Stosując funkcje gm podczas przeliczeń można ustrzec się tego problemu.
Jeżeli zechcesz policzyć różnicę względem innego dnia niż aktualny, wtedy dla zmiennej $teraz musisz ustalić datę w funkcji gmmktime() podobnie, jak dla dnia docelowego