[PHP] Jak wyliczyć i pokazać datę/godzinę powiększoną lub pomniejszoną o dowolną ilość dni/godzin względem aktualnej lub innej daty/godziny?
Chcesz wyliczyć jaka data lub godzina będzie za 16 dni lub przed 398 godzinami od teraz. Chcesz wyliczyć również jaka data lub godzina będzie za 450 godzin od dowolnej innej daty/godziny. Chcesz wreszcie wyliczać przesunięcia w czasie do przodu lub do tyłu z dokładnością co do sekundy.
Manipulowanie czasem w PHP jest bardzo wygodne i bez trudu możesz wyliczyć jaki rok, miesiąc lub dzień wypadł 6547 dni temu. Możesz też sprawdzić jaka godzina będzie po 4678 sekundach od podanej wcześniej pory dnia. Przesunięcia w czasie można wyliczać co do sekundy.
Wszystkie takie operacje mają ogromne znaczenie praktyczne. Łatwo sprawdzisz czy ogłoszenie straciło już ważność w serwisie ogłoszeniowym, czy użytkownik po 30 dniach wciąż ma prawo korzystać z płatnych informacji lub wyliczysz porę, po której informacja w serwisie nie jest już nowością, co pozwoli zrezygnować z napisu "nowość".
Oto kod, który wylicza przesunięcie o dowolną ilość sekund względem aktualnego dnia:
<?
$dzisiaj = date("Y").".".date("m").".".date("d");
$roznica=gmmktime()+60*60*24*3; // dodatkowe 3 dni
$nowadata = gmdate("Y",$roznica).".".
gmdate("m",$roznica).".".gmdate("d",$roznica);
echo "$dzisiaj - $nowadata";
?>
Wynik działania: 2004.05.15 - 2004.05.18
Funkcja date() zwraca aktualną datę lub godzinę, np. date("m") zwróci aktualny numer miesiąca. Domyślnie funkcja korzysta z aktualnego znacznika czasu, który można pobrać za pomocą funkcji mktime().
Funkcja date("m") działa identycznie jak date("m",mktime()). Skoro możemy podać znacznik czasu, nic nie stoi na przeszkodzie aby ten znacznik zwiększyć lub zmniejszyć.
Znacznik czasu zwracany jest w sekundach. Dlatego aby zwiększyć go o 3 dni, trzeba dodać 60 sekund pomnożone przez 60 (mamy już godziny) pomnożone przez 24 (co daje nam pełne dni) i dodatkowo pomnożone przez 3, co da w sumie znacznik czasu powiększony o 3 dni.
Na jego podstawie można już wyliczyć nową datę. Gdy zamiast plusa wstawisz minus, otrzymasz datę pomniejszoną o trzy dni.
Niektóre funkcje zaczynają się od przyrostka gm (gmdate i gmmktime) mają one identyczne znaczenie jak date i 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.
Poniższy przykład wyznacza datę względem dowolnej innej daty:
<?
$znacznik = mktime(0,0,0,12,28,2002); // 2002.12.28
$znacznik2 = gmmktime(0,0,0,12,28,2002);
$dzien = date("Y",$znacznik).".".date("m",$znacznik).".".date("d",$znacznik);
$roznica=$znacznik2-60*60*24*32; // 32 dni wstecz
$nowadata = gmdate("Y",$roznica).".".
gmdate("m",$roznica).".".gmdate("d",$roznica);
echo "$dzien - $nowadata";
?>
Wynik działania: 2002.12.28 - 2002.11.26
Znacznik czasu możesz wyliczyć dla dowolnej daty podając w wywołaniu funkcji mktime() dowolny dzień i godzinę. Pierwsze trzy pozycje to godzina, minuta i sekunda, a kolejne trzy to miesiąc, dzień i rok.
Ponieważ nie korzystamy z minut przy obliczaniu różnicy dni, można je ustawić na 0. Teraz na podstawie znacznika ustalamy dzień początkowy, a dzień końcowy powstaje po zmodyfikowaniu go o określoną liczbę sekund, jak poprzednio.
Możesz też manipulować godzinami. Zasada jest identyczna jak w poprzednich przykładach, dochodzi tylko dodatkowe wywołanie funkcji date() odpowiedzialnych za wyliczenie godziny, minuty i sekundy.
<?
$dzisiaj = date("Y").".".date("m").".".date("d")
." - ".date("H").":".date("i").":".date("s");
$roznica=gmmktime()+765; // dodatkowe 765 sekund
$nowadata = gmdate("Y",$roznica).".".gmdate("m",$roznica).".".
gmdate("d",$roznica)." - ".gmdate("H",$roznica).":".
gmdate("i",$roznica).":".gmdate("s",$roznica);
echo "$dzisiaj - $nowadata";
?>
Wynik działania: 2004.05.15 - 02:05:39 - 2004.05.15 - 02:18:24
A teraz przesunięcie względem pełnej daty z godziną, tu również zasada jest taka sama, a zamiast zer podana jest dokładna godzina:
<?
$znacznik = mktime(23,53,11,12,28,2002); // 2002.12.28 - 23:53:11
$znacznik2 = gmmktime(23,53,11,12,28,2002);
$dzien = date("Y",$znacznik).".".date("m",$znacznik).".".date("d",$znacznik)
." - ".date("H",$znacznik).":".date("i",$znacznik).":".date("s",$znacznik);
$roznica=$znacznik2-60*60*24*10; // 10 dni wstecz
$nowadata = gmdate("Y",$roznica).".".gmdate("m",$roznica).".".
gmdate("d",$roznica)." - ".gmdate("H",$roznica).":".
gmdate("i",$roznica).":".gmdate("s",$roznica);
echo "$dzien - $nowadata";
?>
2002.12.28 - 23:53:11 - 2002.12.18 - 23:53:11
Jak widzisz, bez problemu można wyliczyć dowolny dzień i godzinę względem aktualnej daty bądź każdej innej, podanej przez Ciebie lub użytkownika. Wystarczy modyfikować w tym celu znacznik czasu o dowolną liczbę sekund.