Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Czas relatywny, Czas dla ludzi w polskim wydaniu
klocu
post 29.06.2008, 12:56:02
Post #1





Grupa: Zarejestrowani
Postów: 291
Pomógł: 45
Dołączył: 21.08.2007

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


Witam.
Przeglądając fora, stwierdziłem iż miło byłoby napisać klasę transformującą datę na polski.
Coś co można powiedzieć było wzorcem - była klasa zamieszczona w manualu php. Jednak to nie było to, funkcja nie stosowała odmiany polskich zapisów czasowych (minut, minuty, minutę - choćby tego).
Po kilkunastu próbach otrzymałem coś takiego.

Wiesz jak dokonać optymalizacji? Masz pomysł jak to przebudować? Widzisz błąd? Skomentuj to. Chce udoskonalić tę funkcję. Jednak czasem najwięcej pomysłów przedstawią Ci ludzi, którzy mają inny pomysł na przetestowanie tego samego.

Wejście: do funkcji przekazujesz datę "Y-m-d H:i:s" (najłatwiej bo z MySQL poprzez DATETIME)
Wyjście: funkcja zwraca czas zapisany w formie opisowej dla czasu do 30 dni wstecz, lub w formie nieprzetworzonej (z co najwyżej zmienioną kolejnością parametrów w dacie) gdy liczba ta sięga powyżej dni 30.

  1. <?php
  2. function czas_relatywny( $data_wejsciowa ) {
  3.  
  4. $roznica_czasu = time() - strtotime( $data_wejsciowa );
  5. if( $roznica_czasu < 0 ) { die(); }
  6. $okres = array('sekund', 'minut', 'godzin', null, 'dni');
  7. $dlugosc = array(60,60,24,3,31);
  8.  
  9. for($j = 0; $roznica_czasu >= $dlugosc[$j]; $j++) { if( !isset($dlugosc[$j]) ) { break; } if( $j<3) { $roznica_czasu /= $dlugosc[$j]; } }
  10. $roznica_czasu = round(abs($roznica_czasu));
  11.  
  12. switch( $j ) {
  13. case 0: case 1: case 2:
  14. switch( $roznica_czasu ) {
  15. case 1: $okres[$j] .= 'a'; break;
  16. case 2:case 3:case 4:case 22:case 23:case 24:case 32:case 33:case 34:case 42:case 43:case 44:case 52:case 53:case 54: $okres[$j] .= 'y'; break;
  17. } break;
  18. case 3:
  19. switch( $roznica_czasu ) {
  20. case 1: $okres[$j] = 'wczoraj'; break;
  21. case 2: $okres[$j] = 'przedwczoraj'; break;
  22. case 3: $j=4; break;
  23. } break;
  24. }
  25.  
  26. if( $j==0 or $j==1 or $j==2 or $j == 4 ) { return $roznica_czasu.' '.$okres[$j].' temu, '.date("H:i",strtotime( $data_wejsciowa )); }
  27. elseif( $j == 3 ) { return $okres[$j].', '.date("H:i",strtotime( $data_wejsciowa )); }
  28. elseif( $j == 5 ) { return date("d-m-Y H:i",strtotime( $data_wejsciowa )); }
  29. }
  30.  
  31. ?>


Przykłady wywołań:
  1. <?php
  2. echo czas_relatywny( date( "Y-m-d H:i:s", strtotime("-1 minute")) ).'<br/>';
  3. echo czas_relatywny( date( "Y-m-d H:i:s", strtotime("-1 day")) ).'<br/>';
  4. echo czas_relatywny( date( "Y-m-d H:i:s", strtotime("-29 days")) ).'<br/>';
  5. echo czas_relatywny( date( "Y-m-d H:i:s", strtotime("-30 days")) ).'<br/>';
  6. echo czas_relatywny( date( "Y-m-d H:i:s", strtotime("-31 days")) ).'<br/>';
  7. echo czas_relatywny( date( "Y-m-d H:i:s", strtotime("-1 year")) ).'<br/>';
  8. ?>


Ten post edytował klocu 29.06.2008, 12:58:18
Go to the top of the page
+Quote Post
przem1969
post 8.01.2014, 19:37:17
Post #2





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

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


Jak przerobić ten kod żeby wyświetlało po godzinie dzisiaj a po 7 dniach tydzień temu?
Go to the top of the page
+Quote Post
PiotrekM
post 1.03.2014, 14:41:02
Post #3





Grupa: Zarejestrowani
Postów: 130
Pomógł: 6
Dołączył: 20.12.2009

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


Cytat(przem1969 @ 8.01.2014, 19:37:17 ) *
Jak przerobić ten kod żeby wyświetlało po godzinie dzisiaj a po 7 dniach tydzień temu?


  1. <?php
  2. class Date
  3. {
  4. public static function relative($time, $dateformat = 'd.m.Y, H:i')
  5. {
  6. $peroid = array('minute' => 60, 'hour' => 3600, 'day' => 86400, 'week' => 604800);
  7. $time = time()-strtotime($time);
  8.  
  9. if(($time/$peroid['minute']) < 60)
  10. {
  11. if(round($time/$peroid['minute']) == 1)
  12. return 'minutę temu';
  13.  
  14. if(round($time/$peroid['minute']) >= 2 and round($time/$peroid['minute']) <= 4)
  15. return round($time/$peroid['minute']) .' minuty temu';
  16.  
  17. return round($time/$peroid['minute']) . ' minut temu';
  18. }
  19.  
  20. elseif(($time/$peroid['hour']) < 24)
  21. {
  22. if(round($time/$peroid['hour']) == 1)
  23. return 'godzinę temu';
  24.  
  25. if(round($time/$peroid['hour']) >= 2 and round($time/$peroid['hour']) <= 4)
  26. return round($time/$peroid['hour']) . ' godziny temu';
  27.  
  28. return round($time/$peroid['hour']) . ' godzin temu';
  29. }
  30.  
  31. elseif(($time/$peroid['day']) < 7)
  32. {
  33. if(floor(($time/$peroid['day'])) == 1)
  34. return 'wczoraj';
  35.  
  36. if(floor(($time/$peroid['day'])) == 2)
  37. return 'przedwczoraj';
  38.  
  39. return floor(($time/$peroid['day'])) . ' dni temu';
  40. }
  41.  
  42. elseif(($time/$peroid['week']) < 4)
  43. {
  44. if(floor(($time/$peroid['week'])) == 1)
  45. return 'tydzień temu';
  46.  
  47. return floor(($time/$peroid['week'])) . ' tygodnie temu';
  48. }
  49. else
  50. {
  51. return date($dateformat, time()+$time);
  52. }
  53. }
  54. }
  55.  
  56. echo Date::relative(date( "Y-m-d H:i:s", strtotime("-3 days")));


może się przyda
Go to the top of the page
+Quote Post
Michael2318
post 17.03.2014, 15:21:08
Post #4





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

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


Ten sam dział, trzy tematy niżej: Temat: funkcja data przyjazna uzytkownikom
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 19:29