Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czas na podstawie zwrotu
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
siemakuba
Urzeczony funkcjonalnością, z jaką spotkałem się w serwisie www.rememberthemilk.com (RTM.com) postanowiłem zbudować polski odpowiednik, bo uważam, że jest to bardzo fajna sprawa z punktu widzenia użytkownika wprowadzającego datę w formularzu. Wiadomo, często pojawia się problem z nieprawidłowym formatem daty, jego walidacją czy zmuszaniem użytkownika do podawania daty tak jak wymaga system a nie tak jak użytkownik chce.

To co zobaczyłem na RTM.com, a czego polską wersję pokazuję tu bardzo mi się spodobało.
Skoro jest sobota, i chcę w formularzu wpisać datę wydarzenia, które jest w czwartek, muszę się najpierw zastanowić, jaka data w czwartek. RTM.com daje możliwość wpisania "next monday", "next january" itp. Dopiero w razie nierozpoznania wprowadzonej daty prosi o poprawę. Mi się jeszcze takie nierozpoznanie nie trafiło.

Do rzeczy: poniższa funkcja przyjmuje dwa opcjonalne parametry:
1. $dateString - ciąg znaków na podstawie jakiego chcemy dostać datę
2. $dateFormat - jak sfrormatowana ma być podawana data (ciąg znaków poprawny dla funkcji date" title="Zobacz w manualu php" target="_manual)

Jeżeli żaden z parametrów nie jest podany, zwrócony będzie aktualny timestamp.
Jeżeli podany tylko pierwszy parametr, zwrócony będzie timestamp dla podanego ciągu lub info o błędzie
Jeżeli podane obydwa parametry, zwracany ciąg zostanie sformatowany zgodnie z parametrem $dateFormat.

Funkcja:

  1. <?php
  2. function GetDateFor($dateString = null, $dateFormat = null)
  3. {
  4. if (is_null($dateString))
  5. { return is_null($dateFormat) ? time() : date($dateFormat);
  6. }
  7.  
  8. $markers =  array(
  9. 'nastepny' => 'next', 
  10. 'nastepna' => 'next', 
  11. 'przyszly' => 'next',
  12. 'przyszla' => 'next',
  13. 'poprzedni' => 'last',
  14. 'poprzednia' => 'last',
  15. 'zeszly' => 'last',
  16. 'zeszla' => 'last',
  17. 'ostatni' => 'last',
  18. 'ostatnia' => 'last',
  19. 'teraz' => 'now',
  20. 'dzis' => 'today',
  21. 'dzisiaj' => 'today',
  22. 'jutro' => '+1 day',
  23. 'przedwczoraj' => '-2 days',
  24. 'przed wczoraj' => '-2 days',
  25. 'wczoraj' => '-1 day',
  26. 'po jutrze' => '+2 days',
  27. 'pojutrze' => '+2 days',
  28. 'tydzien' => 'week',
  29. 'dzien' => 'day',
  30. 'miesiac' => 'month',
  31. 'rok' => 'year',
  32. 'ten' => 'this',
  33. 'temu' => 'ago',
  34. 'dni' => 'days',
  35. 'miesiace' => 'months',
  36. 'miesiecy' => 'months',
  37. 'lata' => 'years',
  38. 'lat' => 'years',
  39. 'ta' => 'this',
  40. 'za' => '+',
  41. );
  42.  
  43. $weekDays = array(
  44. 'poniedzialek'  => 'monday',
  45. 'wtorek' => 'tuesday',
  46. 'sroda' => 'wednesday',
  47. 'czwartek' => 'thursday',
  48. 'piatek' => 'friday',
  49. 'sobota' => 'saturday',
  50. 'niedziela' => 'sunday'
  51. );
  52.  
  53. $months =  array(
  54. 'styczen' => 'january',
  55. 'luty' => 'february',
  56. 'marzec' => 'march',
  57. 'kwiecien' => 'april',
  58. 'maj' => 'may',
  59. 'czerwiec' => 'june',
  60. 'lipiec' => 'july',
  61. 'sierpien' => 'august',
  62. 'wrzesien' => 'september',
  63. 'październik' => 'october',
  64. 'listopad' => 'november',
  65. 'grudzien' => 'december'
  66. );
  67.  
  68. $time =  array(
  69. 'godzina' => 'hour',
  70. 'godziny' => 'hours',
  71. 'godzine' => 'hour',
  72. 'minuty' => 'min',
  73. 'minuta' => 'min',
  74. 'minut' => 'min',
  75. 'sekunda' => 'sec',
  76. 'sekund' => 'sec',
  77. 'sekundy' => 'sec'
  78. );
  79. $numerals = array(
  80. 'jeden'  => '1',
  81. 'dwa' => '2',
  82. 'trzy' => '3',
  83. 'cztery' => '4',
  84. 'piec' => '5',
  85. 'szesc' => '6',
  86. 'siedem' => '7',
  87. 'osiem' => '8',
  88. 'dziewiec' => '9',
  89. 'dziesiec' => '10'
  90. );
  91.  
  92. $letters = array( 'ą'=>'a','Ą'=>'a','ś'=>'s','Ś'=>'s','ż'=>'z','Ż'=>'z','ź'=>'z','Ź'=>'z','ę'=>'e','Ę'=>'e',
  93. 'ć'=>'c','Ć'=>'c','ń'=>'n','Ń'=>'n','ł'=>'l','Ł'=>'l','ó'=>'o','Ó'=>'o');
  94.  
  95. $dString = strtolower(str_replace(array_keys($letters), $letters, $dateString));
  96. $replace = array_merge($weekDays, $months, $time, $markers, $numerals);
  97. $rString = str_replace(array_keys($replace), $replace, $dString);
  98. $date  = @strtotime($rString);
  99.  
  100. if ($date === -1)
  101. { return 'Niepoprawny formay daty! ('.$rString.')';
  102. }
  103.  
  104. if (!is_null($dateFormat))
  105. { $date = date($dateFormat, $date);
  106. }
  107.  
  108. return $date;
  109. }
  110. ?>


Przykład użycia:
  1. <?php
  2. $dates = array('dziś', 'jutro', 'pojutrze', 'wczoraj', 'przyszła sobota', 'następny wtorek', 
  3. 'następny tydzień', '2 lata temu', '7 miesięcy temu', 'przedwczoraj', 'za rok', 'za 4 minuty', 'za godzinę', 'za 10 minut',
  4. 'za 20 sekund', 'za trzy dni', 'za pięć lat', 'za 12 miesięcy');
  5.  
  6.  
  7. for ($i = 0, $n = count($dates); $i < $n; $i++)
  8. {
  9. echo $dates[$i]." => ".GetDateFor($dates[$i], 'd-m-Y H:i:s').'<br>';
  10. }
  11. ?>


wynik (dla czasu 01-12-2006 17:06:41):
Kod
dziś => 01-12-2006 17:06:41
jutro => 02-12-2006 17:06:41
pojutrze => 03-12-2006 17:06:41
wczoraj => 30-11-2006 17:06:41
przyszła sobota => 02-12-2006 00:00:00
następny wtorek => 05-12-2006 00:00:00
następny tydzień => 08-12-2006 17:06:41
2 lata temu => 01-12-2004 17:06:41
7 miesięcy temu => 01-05-2006 17:06:41
przedwczoraj => 29-11-2006 17:06:41
za rok => 01-12-2007 17:06:41
za 4 minuty => 01-12-2006 17:10:41
za godzinę => 01-12-2006 18:06:41
za 10 minut => 01-12-2006 17:16:41
za 20 sekund => 01-12-2006 17:07:01
za trzy dni => 04-12-2006 17:06:41
za pięć lat => 01-12-2011 17:06:41
za 12 miesięcy => 01-12-2007 17:06:41


Mam nadzieję, że komuś się przyda a wprowadzanie daty stanie się bardziej przyjazne :)

pozdr.
kwiateusz
bardzo fajny pomysł jak bede miał okazje to na pewno wykorzystam smile.gif
nediam
no no nie zle smile.gif

gdy bede uzywal mam cie podawac w credits ? biggrin.gif
siemakuba
Cytat(nediam @ 7.12.2006, 18:20:40 ) *
gdy bede uzywal mam cie podawac w credits ? :D

No pewnie, i przyślij mi dolara ;) hehehe *joke*.
Używaj sobie jak chcesz i gdzie chcesz, umieściłem tutaj po to żeby komuś się przydało :)
A "credits" czy whatever możesz sobie darować :)

pozdr.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.