Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Algorytmy, klasy, funkcje _ [PHP] Czas relatywny

Napisany przez: klocu 29.06.2008, 12:56:02

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 = http://www.php.net/time() - http://www.php.net/strtotime( $data_wejsciowa );
  5. if( $roznica_czasu < 0 ) { http://www.php.net/die(); }
  6. $okres = http://www.php.net/array('sekund', 'minut', 'godzin', null, 'dni');
  7. $dlugosc = http://www.php.net/array(60,60,24,3,31);
  8.  
  9. for($j = 0; $roznica_czasu >= $dlugosc[$j]; $j++) { if( !http://www.php.net/isset($dlugosc[$j]) ) { break; } if( $j<3) { $roznica_czasu /= $dlugosc[$j]; } }
  10. $roznica_czasu = http://www.php.net/round(http://www.php.net/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, '.http://www.php.net/date("H:i",http://www.php.net/strtotime( $data_wejsciowa )); }
  27. elseif( $j == 3 ) { return $okres[$j].', '.http://www.php.net/date("H:i",http://www.php.net/strtotime( $data_wejsciowa )); }
  28. elseif( $j == 5 ) { return http://www.php.net/date("d-m-Y H:i",http://www.php.net/strtotime( $data_wejsciowa )); }
  29. }
  30.  
  31. ?>


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

Napisany przez: przem1969 8.01.2014, 19:37:17

Jak przerobić ten kod żeby wyświetlało po godzinie dzisiaj a po 7 dniach tydzień temu?

Napisany przez: PiotrekM 1.03.2014, 14:41:02

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


może się przyda

Napisany przez: Michael2318 17.03.2014, 15:21:08

Ten sam dział, trzy tematy niżej: http://forum.php.pl/funkcja_data_przyjazna_uzytkownikom_t212265.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)