Dla własnych potrzeb, napisałem funkcję, która zamieni sztywne daty, typu: YYYY-mm-dd, H:m:i na coś ciekawszego.
Funkcja zamienia daty na poniższe wzorce:
DLA DAT PRZESZŁYCH
- minutę temu (jeśli czas jest krótszy niż 60 sekund),
- X minut temu (max. 59 minut temu),
- Dzisiaj, 20:59 (jeśli czas jest dłuższy niż 60 minut),
- Wczoraj, 20:59 (jeśli zmienił się dzień),
- Sobota, 20:59 (dla dat starszych niż ww. 'wczoraj', przypisywane są dni tygodnia, max. 6 dni do tyłu),
- 2013-02-03, 01:06:41 (dla dat starszych bądź równych tydzień).
DLA DAT PRZYSZŁYCH:
- Za minutę (jeśli czas do wydarzenia jest krótszy niż 60 sekund),
- Za X minut (max. 59 minut),
- Dzisiaj, 20:59 (jeśli czas do wydarzenia jest dłuższy niż 60 minut),
- Jutro, 20:59 (jeśli do czasu wydarzenia nastąpi zmiana dni),
- Sobota, 20:59 (dla dat bardziej odległych niż ww. 'jutro', przypisywane są dni tygodnia, max. 6 dni do przodu),
- 2013-02-03, 01:06:41 (dla dat równych bądź odległych od tygodnia [7 dni]).
Kod funkcji:
function create_friendly_date($timestamp) { /* langs past */ $lang['Minute_Ago'] = 'Minutę temu'; $lang['Minutes_Ago_2_4'] = '%s minuty temu'; $lang['Minutes_Ago_5_59'] = '%s minut temu'; $lang['Today'] = 'Dzisiaj, %s'; $lang['Yesterday'] = 'Wczoraj, %s'; $lang['Mon'] = 'Poniedziałek, %s'; $lang['Tue'] = 'Wtorek, %s'; $lang['Wed'] = 'Środa, %s'; $lang['Thu'] = 'Czwartek, %s'; $lang['Fri'] = 'Piątek, %s'; $lang['Sat'] = 'Sobota, %s'; $lang['Sun'] = 'Niedziela, %s'; /* langs future */ $lang['For_Minute'] = 'Za minutę'; $lang['For_Minutes_2_4'] = 'Za %s minuty'; $lang['For_Minutes_5_59'] = 'Za %s minut'; $lang['Tomorow'] = 'Jutro, %s'; $lang['Now'] = 'W tym momencie'; // można zmienić np. na 'Teraz' $timestamp = http://www.php.net/intval($timestamp); $now = http://www.php.net/time(); $day_time = http://www.php.net/floor($timestamp/86400); $timedate = http://www.php.net/date("H:i", $timestamp); $day_now = http://www.php.net/floor($now/86400); $same_day = ($day_time == $day_now) ? TRUE : FALSE; if ( $timestamp < 1 ) { return FALSE; } $past_or_future = ($now > $timestamp) ? TRUE : FALSE; if ( $now == $timestamp ) { return $lang['Now']; } else if ( $past_or_future ) { $maths = $now - $timestamp; $day_before = $day_now-$day_time; if ( $same_day && $maths <= 60 ) { return $lang['Minute_Ago']; } else if ( $same_day && $maths > 60 && $maths <= 240 ) { $ret = http://www.php.net/ceil($maths/60); return http://www.php.net/sprintf($lang['Minutes_Ago_2_4'], $ret); } else if ( $same_day && $maths > 240 && $maths <= 3540 ) { $ret = http://www.php.net/ceil($maths/60); if ( http://www.php.net/substr($ret, 0, 1) > 1 && http://www.php.net/substr($ret, 1, 1) > 1 && http://www.php.net/substr($ret, 1, 1) < 5 ) { return http://www.php.net/sprintf($lang['Minutes_Ago_2_4'], $ret); } else { return http://www.php.net/sprintf($lang['Minutes_Ago_5_59'], $ret); } } else if ( $same_day && $maths > 3540 ) { return http://www.php.net/sprintf($lang['Today'], $timedate); } else if ( !$same_day && $day_before == 1 ) { return http://www.php.net/sprintf($lang['Yesterday'], $timedate); } else if ( !$same_day && $day_before > 1 && $day_before < 7 ) { if ( $day_before == 2 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now-172800))], $timedate); } else if ( $day_before == 3 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now-259200))], $timedate); } else if ( $day_before == 4 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now-345600))], $timedate); } else if ( $day_before == 5 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now-432000))], $timedate); } else if ( $day_before == 6 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now-518400))], $timedate); } } else { return http://www.php.net/date("Y-m-d, H:i", $timestamp); } } else { $maths = $timestamp - $now; $day_after = $day_time-$day_now; if ( $same_day && $maths <= 60 ) { return $lang['For_Minute']; } else if ( $same_day && $maths > 60 && $maths <= 240 ) { $ret = http://www.php.net/ceil($maths/60); return http://www.php.net/sprintf($lang['For_Minutes_2_4'], $ret); } else if ( $same_day && $maths > 240 && $maths <= 3540 ) { $ret = http://www.php.net/ceil($maths/60); if ( http://www.php.net/substr($ret, 0, 1) > 1 && http://www.php.net/substr($ret, 1, 1) > 1 && http://www.php.net/substr($ret, 1, 1) < 5 ) { return http://www.php.net/sprintf($lang['For_Minutes_2_4'], $ret); } else { return http://www.php.net/sprintf($lang['For_Minutes_5_59'], $ret); } } else if ( $same_day && $maths > 3540 ) { return http://www.php.net/sprintf($lang['Today'], $timedate); } else if ( !$same_day && $day_after == 1 ) { return http://www.php.net/sprintf($lang['Tomorow'], $timedate); } else if ( !$same_day && $day_after > 1 && $day_after < 7 ) { if ( $day_after == 2 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now+172800))], $timedate); } else if ( $day_after == 3 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now+259200))], $timedate); } else if ( $day_after == 4 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now+345600))], $timedate); } else if ( $day_after == 5 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now+432000))], $timedate); } else if ( $day_after == 6 ) { return http://www.php.net/sprintf($lang[http://www.php.net/date("D", ($now+518400))], $timedate); } } else { return http://www.php.net/date("Y-m-d, H:i", $timestamp); } } }
http://www.php.net/echo create_friendly_date('1359327794');
To jest wszystko git tylko dynamiki w tym brak ! Statyka owszem. gdy chciałbym wstawiac artykuly na strone to musze zmieniac date za kazdym razem wstawianego artykulu !
Witaj,
Bardzo fajna klasa, ale albo robię coś źle, albo w funkcji coś jest nie tak.
Przykład:
$teraz = '2015-02-12 11:00:41';
$jutro = '2015-02-13 00:30:00';
i funkcja pokazuje mi "Dzisiaj, 00:30", a przecięż 30 minut po północy to już jutro.
Jeśli natomiast jako datę jutrzejszą ustawię godzinę 1:00, czyli '2015-02-13 01:00:00';
to mam już poprawnie "Jutro, 01:00"
Zastanawiałem się czy nie jest to kwestia stref czasowych, ale mam ustawione chyba poprawnie Europe/Belgrade => CET
Będę wdzięczny za pomoc
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)