[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"
Powyższy kod możecie do woli modyfikować i stosować w swoich skryptach, przy czym fajnie aby było gdzieś wspomniane o mnie jako autorze :-)