[PHP] formatowanie daty
Przy tworzeniu stron internetowych często trzeba wyświetlić datę, czy to z bazy danych czy z jakiegokolwiek innego źródła. Chciałbym zaprezentować tutaj funkcję która w atrakcyjny sposób formatuje przesłaną datę w zależności od jej miejsca w przeszłości, np.:
15:28 / 17 sek. temu
21:59 / 23 godz. temu
03.02.2008 / 16:38
Z takim formatowaniem już się kiedyś spotkałem - pomysł nie jest mój, ale kod jak najbardziej autorski. Skrypt ten stosuję praktycznie zawsze kiedy trzeba pokazać datę, taki sposób prezentacji jest po prostu bardziej intuicyjny dla odbiorcy:
| 1 | function formatDate($data) { |
| 2 | $data = explode(" ", $data); |
| 3 | $days = explode("-", $data[0]); |
| 4 | $time = explode(":", $data[1]); |
| 5 | $data = mktime($time[0], $time[1], $time[2], $days[1], $days[2], $days[0]); |
| 6 | if ($data >= time()-60) { |
| 7 | $ile_temu = time()- $data; |
| 8 | $ile_temu = floor($ile_temu); |
| 9 | return $time[0].":".$time[1]." / <span class="date_bold"><strong>".$ile_temu." sek. temu </strong></span>"; |
| 10 | } |
| 11 | if (($data >= time()-3600) and ($data < time()-60)) { |
| 12 | $ile_temu = time()- $data; |
| 13 | $ile_temu = $ile_temu / 60; |
| 14 | $ile_temu = floor($ile_temu); |
| 15 | return $time[0].":".$time[1]." / <span class="date_bold"><strong>".$ile_temu." min. temu </strong></span>"; |
| 16 | } |
| 17 | if (($data >= time()-86400) and ($data < time()-3600)) { |
| 18 | $ile_temu = time()- $data; |
| 19 | $ile_temu = $ile_temu / 3600; |
| 20 | $ile_temu = floor($ile_temu); |
| 21 | return $time[0].":".$time[1]." / <span class="date_bold">".$ile_temu." godz. temu</span>"; |
| 23 | } else |
| 24 | return $days[0]."-".$days[1]."-".$days[2]." / ".$time[0].":".$time[1]; |
| 26 | } |
Funkcja jako argument przyjmuje datę w formacie yyyy-mm-dd hh:mm:ss, takie dane przychodzą np. bezpośrednio z MySQL, przy czym data przy formatowaniu jest porównywana z czasem lokalnym serwera. Na koniec zwracany jest ciąg znaków w postaci przedstawionej we wstępie. Warto pamiętać aby w pliku CSS strony określić klasę "date_bold" - odpowiada ona za styl wyświetlenia informacji typu "xx godz. temu, xx sekund temu" itd. A teraz trochę o kodzie funkcji:
| Linijki | Funkcja |
| 2-4 | rozbicie dostarczonej daty na trój-elementowe tablice dla godziny i dnia |
| 5 | przygotowanie uniksowego znacznika czasu (aby móc go porównać z aktualnym czasem) |
| 6-10 | jeśli data jest młodsza niż 60s, zwraca np. "15:17 / 15 sek. temu" |
| 11-16 | jeśli data jest młodsza niż 60min, zwraca np. "17:12 / 25 min. temu" |
| 17-23 | jeśli data jest młodsza niż 24h, zwraca np. "12:35 / 23 godz. temu" |
| 24 | powyżej 24 godzin funkcja zwraca standardowy format np. "12-03-2008 / 15:13" |