Jacek Kowalski
2012-08-26 afa613ab73320ad21d83b8a16f3725d7525f95cb
commit | author | age
8bd4d9 1 <?php
JK 2 /**
3  * @todo Potrzebna jest funkcja, które będzie wyciągać datę z początku lub końca danego ciągu. Patrz: {@link tv::parse_date()}
4  */
5 class calendar {
6     /**
7      * @param string $date Data w formacie "naturalnym". Np. jutro, 1 stycznia, piątek
8      * @return int Uniksowy znacznik czasu. Do użycia w funkcji date()
9      * @uses funcs::utfToAscii()
10      */
11     static function parse_date($date) {
12         $date = funcs::utfToAscii($date);
13         switch($date) {
14             case 'jutro':
15                 return strtotime('tomorrow');
16             case 'za tydzien':
17                 return strtotime('+1 week');
18             case 'pojutrze':
19             case 'po jutrze':
20                 return strtotime('tomorrow +1 day');
21             case 'dzis':
22                 return mktime(0, 0, 0);
23             case 'teraz':
24             case '':
25                 return time();
26             case 'wczoraj':
27                 return strtotime('yesterday');
28             case 'przedwczoraj':
29             case 'przed wczoraj':
30                 return strtotime('yesterday -1 days');
31             case 'poniedzialek':
32                 return strtotime('monday');
33             case 'wtorek':
34                 return strtotime('tuesday');
35             case 'sroda':
36                 return strtotime('wednesday');
37             case 'czwartek':
38                 return strtotime('thursday');
39             case 'piatek':
40                 return strtotime('friday');
41             case 'sobota':
42                 return strtotime('saturday');
43             case 'niedziela':
44                 return strtotime('sunday');
45         }
46         
47         if(substr($date, 0, 2)=='za') {
48             $czego = array(
49                 'sekunde' => 'second',
50                 'sekund' => 'seconds',
51                 'sekundy' => 'seconds',
52                 'minuta' => 'minute',
53                 'minut' => 'minutes',
54                 'minuty' => 'minutes',
55                 'godzine' => 'hour',
56                 'godzin' => 'hours',
57                 'godziny' => 'hours',
58                 'dzien' => 'day',
59                 'dni' => 'days',
60                 'miesiac' => 'month',
61                 'miesiecy' => 'months',
62                 'miesiace' => 'months',
63                 'rok' => 'year',
64                 'lat' => 'years',
65                 'lata' => 'years',
66             );
67             $date = trim(substr($date, 2));
68             
69             $ile = array(
70                 'zero' => 0,
71                 'jeden' => 1,
72                 'dwa' => 2,
73                 'trzy' => 3,
74                 'cztery' => 4,
75                 'piec' => 5,
76                 'szesc' => 6,
77                 'siedem' => 7,
78                 'osiem' => 8,
79                 'dziewiec' => 9,
80                 'dziesiec' => 10,
81             );
82             foreach($ile as $key => $num) {
83                 if(substr($date, 0, strlen($key)) == $key) {
84                     $ile = $num;
85                     $done = TRUE;
86                     $date = trim(substr($date, strlen($key)));
87                     break;
88                 }
89             }
90             
91             if($done) {
92             }
93             elseif(!is_numeric(substr($date, 0, 1))) {
94                 $ile = 1;
95             }
96             else
97             {
98                 $ile = (int)$date;
99                 $date = trim(substr($date, strlen($ile)));
100             }
101             
102             $czego = $czego[$date];
103             if(!$czego) return FALSE;
104             
105             return strtotime('+'.$ile.' '.$czego);
106         }
107         
108         if(preg_match('/([0-9]{1,2})\.([0-9]{1,2}).([0-9]{2,4})/', $date, $test)) {
109             return mktime(0, 0, 0, $test[2], $test[1], $test[3]);
110         }
111         elseif(preg_match('/([0-9]{1,2})\.([0-9]{1,2})/', $date, $test)) {
112             return mktime(0, 0, 0, $test[2], $test[1]);
113         }
114         elseif(preg_match('/([0-9]{1,2})\-([0-9]{1,2})\-([0-9]{2,4})/', $date, $test)) {
115             return mktime(0, 0, 0, $test[2], $test[1], $test[3]);
116         }
117         elseif(preg_match('/([0-9]{1,2})\s+([a-z]{3,13})\s+([0-9]{2,4})/', $date, $test) || preg_match('/([0-9]{1,2})\s+([a-z]{3,13})/', $date, $test)) {
118             $array = array(
119                 'styczen' => 1,
120                 'stycznia' => 1,
121                 'luty' => 2,
122                 'lutego' => 2,
123                 'marzec' => 3,
124                 'marca' => 3,
125                 'kwiecien' => 4,
126                 'kwietnia' => 4,
127                 'maj' => 5,
128                 'maja' => 5,
129                 'czerwiec' => 6,
130                 'czerwca' => 6,
131                 'lipiec' => 7,
132                 'lipca' => 7,
133                 'sierpien' => 8,
134                 'sierpnia' => 8,
135                 'wrzesien' => 9,
136                 'wrzesnia' => 9,
137                 'pazdziernik' => 10,
138                 'pazdziernika' => 10,
139                 'listopad' => 11,
140                 'listopada' => 11,
141                 'grudzien' => 12,
142                 'grudnia' => 12,
143             );
144             if(!isset($array[$test[2]])) return FALSE;
145             if(!$test[3]) $test[3] = date('Y');
146             return mktime(0, 0, 0, $array[$test[2]], $test[1], $test[3]);
147         }
148         else
149         {
150             return strtotime($date);
151         }
152     }
153 }
154 ?>