Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [funkcja] data przyjazna użytkownikom
Michael2318
post 3.02.2013, 01:15:19
Post #1





Grupa: Zarejestrowani
Postów: 651
Pomógł: 116
Dołączył: 3.06.2012
Skąd: Lędziny

Ostrzeżenie: (0%)
-----


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:

  1. function create_friendly_date($timestamp)
  2. {
  3. /* langs past */
  4. $lang['Minute_Ago'] = 'Minutę temu';
  5. $lang['Minutes_Ago_2_4'] = '%s minuty temu';
  6. $lang['Minutes_Ago_5_59'] = '%s minut temu';
  7. $lang['Today'] = 'Dzisiaj, %s';
  8. $lang['Yesterday'] = 'Wczoraj, %s';
  9. $lang['Mon'] = 'Poniedziałek, %s';
  10. $lang['Tue'] = 'Wtorek, %s';
  11. $lang['Wed'] = 'Środa, %s';
  12. $lang['Thu'] = 'Czwartek, %s';
  13. $lang['Fri'] = 'Piątek, %s';
  14. $lang['Sat'] = 'Sobota, %s';
  15. $lang['Sun'] = 'Niedziela, %s';
  16. /* langs future */
  17. $lang['For_Minute'] = 'Za minutę';
  18. $lang['For_Minutes_2_4'] = 'Za %s minuty';
  19. $lang['For_Minutes_5_59'] = 'Za %s minut';
  20. $lang['Tomorow'] = 'Jutro, %s';
  21. $lang['Now'] = 'W tym momencie'; // można zmienić np. na 'Teraz'
  22.  
  23.  
  24. $timestamp = intval($timestamp);
  25. $now = time();
  26. $day_time = floor($timestamp/86400);
  27. $timedate = date("H:i", $timestamp);
  28. $day_now = floor($now/86400);
  29. $same_day = ($day_time == $day_now) ? TRUE : FALSE;
  30.  
  31. if ( $timestamp < 1 )
  32. {
  33. return FALSE;
  34. }
  35. $past_or_future = ($now > $timestamp) ? TRUE : FALSE;
  36. if ( $now == $timestamp )
  37. {
  38. return $lang['Now'];
  39. }
  40. else if ( $past_or_future )
  41. {
  42. $maths = $now - $timestamp;
  43. $day_before = $day_now-$day_time;
  44.  
  45. if ( $same_day && $maths <= 60 )
  46. {
  47. return $lang['Minute_Ago'];
  48. }
  49. else if ( $same_day && $maths > 60 && $maths <= 240 )
  50. {
  51. $ret = ceil($maths/60);
  52. return sprintf($lang['Minutes_Ago_2_4'], $ret);
  53. }
  54. else if ( $same_day && $maths > 240 && $maths <= 3540 )
  55. {
  56. $ret = ceil($maths/60);
  57. if ( substr($ret, 0, 1) > 1 && substr($ret, 1, 1) > 1 && substr($ret, 1, 1) < 5 )
  58. {
  59. return sprintf($lang['Minutes_Ago_2_4'], $ret);
  60. }
  61. else
  62. {
  63. return sprintf($lang['Minutes_Ago_5_59'], $ret);
  64. }
  65. }
  66. else if ( $same_day && $maths > 3540 )
  67. {
  68. return sprintf($lang['Today'], $timedate);
  69. }
  70. else if ( !$same_day && $day_before == 1 )
  71. {
  72. return sprintf($lang['Yesterday'], $timedate);
  73. }
  74. else if ( !$same_day && $day_before > 1 && $day_before < 7 )
  75. {
  76. if ( $day_before == 2 )
  77. {
  78. return sprintf($lang[date("D", ($now-172800))], $timedate);
  79. }
  80. else if ( $day_before == 3 )
  81. {
  82. return sprintf($lang[date("D", ($now-259200))], $timedate);
  83. }
  84. else if ( $day_before == 4 )
  85. {
  86. return sprintf($lang[date("D", ($now-345600))], $timedate);
  87. }
  88. else if ( $day_before == 5 )
  89. {
  90. return sprintf($lang[date("D", ($now-432000))], $timedate);
  91. }
  92. else if ( $day_before == 6 )
  93. {
  94. return sprintf($lang[date("D", ($now-518400))], $timedate);
  95. }
  96. }
  97. else
  98. {
  99. return date("Y-m-d, H:i", $timestamp);
  100. }
  101. }
  102. else
  103. {
  104. $maths = $timestamp - $now;
  105. $day_after = $day_time-$day_now;
  106.  
  107. if ( $same_day && $maths <= 60 )
  108. {
  109. return $lang['For_Minute'];
  110. }
  111. else if ( $same_day && $maths > 60 && $maths <= 240 )
  112. {
  113. $ret = ceil($maths/60);
  114. return sprintf($lang['For_Minutes_2_4'], $ret);
  115. }
  116. else if ( $same_day && $maths > 240 && $maths <= 3540 )
  117. {
  118. $ret = ceil($maths/60);
  119. if ( substr($ret, 0, 1) > 1 && substr($ret, 1, 1) > 1 && substr($ret, 1, 1) < 5 )
  120. {
  121. return sprintf($lang['For_Minutes_2_4'], $ret);
  122. }
  123. else
  124. {
  125. return sprintf($lang['For_Minutes_5_59'], $ret);
  126. }
  127. }
  128. else if ( $same_day && $maths > 3540 )
  129. {
  130. return sprintf($lang['Today'], $timedate);
  131. }
  132. else if ( !$same_day && $day_after == 1 )
  133. {
  134. return sprintf($lang['Tomorow'], $timedate);
  135. }
  136. else if ( !$same_day && $day_after > 1 && $day_after < 7 )
  137. {
  138. if ( $day_after == 2 )
  139. {
  140. return sprintf($lang[date("D", ($now+172800))], $timedate);
  141. }
  142. else if ( $day_after == 3 )
  143. {
  144. return sprintf($lang[date("D", ($now+259200))], $timedate);
  145. }
  146. else if ( $day_after == 4 )
  147. {
  148. return sprintf($lang[date("D", ($now+345600))], $timedate);
  149. }
  150. else if ( $day_after == 5 )
  151. {
  152. return sprintf($lang[date("D", ($now+432000))], $timedate);
  153. }
  154. else if ( $day_after == 6 )
  155. {
  156. return sprintf($lang[date("D", ($now+518400))], $timedate);
  157. }
  158. }
  159. else
  160. {
  161. return date("Y-m-d, H:i", $timestamp);
  162. }
  163. }
  164. }


Testowałem i problemów nie było, w razie jakby ktoś zauważył jakiś błąd to prosiłbym o info - poprawię smile.gif
Co do używania to wiadomo, datę podajemy w formacie timestamp, przykład użycia:
  1. echo create_friendly_date('1359327794');

Z dniem wysłania tego posta, funkcja zwraca: Poniedziałek 00:03.

Jeśli podano błędny argument w funkcji, zwrócona zostanie wartość FALSE.

Ten post edytował Michael2318 3.02.2013, 12:29:21
Go to the top of the page
+Quote Post
przem1969
post 8.01.2014, 15:27:50
Post #2





Grupa: Zarejestrowani
Postów: 34
Pomógł: 0
Dołączył: 18.08.2013

Ostrzeżenie: (0%)
-----


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 !
Go to the top of the page
+Quote Post
tikky
post 12.02.2015, 11:07:43
Post #3





Grupa: Zarejestrowani
Postów: 112
Pomógł: 1
Dołączył: 2.10.2007

Ostrzeżenie: (0%)
-----


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

Ten post edytował tikky 12.02.2015, 11:22:06


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.06.2018 - 00:23