PluginProbe ʕ •ᴥ•ʔ
پارسی دیت – Parsi Date / 2.3.1
پارسی دیت – Parsi Date v2.3.1
6.1 5.1.6 5.1.7 5.1.8 5.1.8.2 6.0 trunk 1.0 1.1 1.2 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 2.0.0-alpha 2.1 2.1.1 2.1.2 2.1.3 2.1.5 2.1.6 2.1.7 2.2.0 2.2.1 2.2.2 2.2.3 2.3.0.1 2.3.0.2 2.3.1 2.3.2 2.3.3 2.3.4 3.0.1 3.0.2 3.0.3 4.0.0 4.0.1 4.0.2 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5
wp-parsidate / includes / parsidate.php
wp-parsidate / includes Last commit date
admin 9 years ago plugins 9 years ago widget 9 years ago fixes-archive.php 9 years ago fixes-archives.php 9 years ago fixes-calendar.php 9 years ago fixes-dates.php 9 years ago fixes-misc.php 9 years ago fixes-permalinks.php 9 years ago general.php 9 years ago install.php 9 years ago parsidate.php 9 years ago settings.php 9 years ago
parsidate.php
419 lines
1 <?php
2 /**
3 * Parsi date main conversation class
4 *
5 * @author Mobin Ghasempoor
6 * @package WP-Parsidate
7 * @subpackage DateConversation
8 */
9 /*Special thanks to :
10 Reza Gholampanahi for convert function*/
11
12 class bn_parsidate {
13 protected static $instance;
14 public $persian_month_names = array(
15 '',
16 'فروردین',
17 'اردیبهشت',
18 'خرداد',
19 'تیر',
20 '�
21 رداد',
22 'شهریور',
23 '�
24 هر',
25 'آبان',
26 'آذر',
27 'دی',
28 'به�
29 ن',
30 'اسفند'
31 );
32 public $persian_short_month_names = array(
33 '',
34 'فرو',
35 'ارد',
36 'خرد',
37 'تیر',
38 '�
39 رد',
40 'شهر',
41 '�
42 هر',
43 'آبا',
44 'آذر',
45 'دی',
46 'به�
47 ',
48 'اسف'
49 );
50 public $sesson = array( 'بهار', 'تابستان', 'پاییز', 'ز�
51 ستان' );
52
53 public $persian_day_names = array( 'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'ج�
54 عه', 'شنبه' );
55 public $persian_day_small = array( 'ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش' );
56
57 public $j_days_in_month = array( 31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29 );
58 private $j_days_sum_month = array( 0, 0, 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336 );
59
60 private $g_days_sum_month = array( 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 );
61
62
63 /**
64 * Constructor
65 */
66 function __construct() {
67 if ( $this->IsLeapYear( $this->persian_date( "Y", time(), "eng" ) ) ) {
68 $this->j_days_in_month[11] = 30;
69 }
70 }
71
72 /**
73 * bn_parsidate::IsLeapYear()
74 * check year is leap
75 *
76 * @param mixed $year
77 *
78 * @return boolean
79 */
80 private function IsLeapYear( $year ) {
81 if ( ( ( $year % 4 ) == 0 && ( $year % 100 ) != 0 ) || ( ( $year % 400 ) == 0 ) && ( $year % 100 ) == 0 ) {
82 return true;
83 } else {
84 return false;
85 }
86 }
87
88 /**
89 * bn_parsidate::persian_date()
90 * convert gregorian datetime to persian datetime
91 *
92 * @param mixed $format
93 * @param string $date
94 * @param string $lang
95 *
96 * @return datetime
97 */
98 public function persian_date( $format, $date = 'now', $lang = 'per' ) {
99 $j_days_in_month = array( 31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 365 );
100 $timestamp = is_numeric( $date ) && (int) $date == $date ? $date : strtotime( $date );
101
102 $date = getdate( $timestamp );
103 list( $date['year'], $date['mon'], $date['mday'] ) = self::gregorian_to_persian( $date['year'], $date['mon'], $date['mday'] );
104 $date['mon'] = (int) $date['mon'];
105 $date['mday'] = (int) $date['mday'];
106 $out = '';
107 for ( $i = 0; $i < strlen( $format ); $i ++ ) {
108 Switch ( $format[ $i ] ) {
109 //day
110 case 'd':
111 $out .= ( $date['mday'] < 10 ) ? '0' . $date['mday'] : $date['mday'];
112 break;
113 case 'D':
114 $out .= $this->persian_day_small[ $date['wday'] ];
115 break;
116 case'l':
117 $out .= $this->persian_day_names[ $date['wday'] ];
118 break;
119 case 'j':
120 $out .= $date['mday'];
121 break;
122 case'N':
123 $out .= $this->week_day( $date['wday'] ) + 1;
124 break;
125 case'w':
126 $out .= $this->week_day( $date['wday'] );
127 break;
128 case'z':
129 $out .= $this->j_days_in_month[ $date['mon'] ] + $date['mday'];
130 break;
131 //week
132 case'W':
133 $yday = $this->j_days_sum_month[ $date['mon'] - 1 ] + $date['mday'];
134 $out .= intval( $yday / 7 );
135 break;
136 //month
137 case'f':
138 $mon = $date['mon'];
139 switch ( $mon ) {
140 case( $mon < 4 ):
141 $out .= $this->sesson[0];
142 break;
143 case( $mon < 7 ):
144 $out .= $this->sesson[1];
145 break;
146 case( $mon < 10 ):
147 $out .= $this->sesson[2];
148 break;
149 case( $mon > 9 ):
150 $out .= $this->sesson[3];
151 break;
152 }
153 break;
154 case'F':
155 $out .= $this->persian_month_names[ (int) $date['mon'] ];
156 break;
157 case'm':
158 $out .= ( $date['mon'] < 10 ) ? '0' . $date['mon'] : $date['mon'];
159 break;
160 case'M':
161 $out .= $this->persian_short_month_names[ (int) $date['mon'] ];
162 break;
163 case'n':
164 $out .= $date['mon'];
165 break;
166 case'S':
167 $out .= 'ا�
168 ';
169 break;
170 case't':
171 $out .= $this->j_days_in_month[ (int) $date['mon'] - 1 ];
172 break;
173 //year
174 case'L':
175 $out .= ( ( $date['year'] % 4 ) == 0 ) ? 1 : 0;
176 break;
177 case'o':
178 case'Y':
179 $out .= $date['year'];
180 break;
181 case'y':
182 $out .= substr( $date['year'], 2, 2 );
183 break;
184 //time
185 case'a':
186 $out .= ( $date['hours'] < 12 ) ? 'ق.ظ' : 'ب.ظ';
187 break;
188 case'A':
189 $out .= ( $date['hours'] < 12 ) ? 'قبل از ظهر' : 'بعد از ظهر';
190 break;
191 case'B':
192 $out .= (int) ( 1 + ( $date['mon'] / 3 ) );
193 break;
194 case'g':
195 $out .= ( $date['hours'] > 12 ) ? $date['hours'] - 12 : $date['hours'];
196 break;
197 case'G':
198 $out .= $date['hours'];
199 break;
200 case'h':
201 $hour = ( $date['hours'] > 12 ) ? $date['hours'] - 12 : $date['hours'];
202 $out .= ( $hour < 10 ) ? '0' . $hour : $hour;
203 break;
204 case'H':
205 $out .= ( $date['hours'] < 10 ) ? '0' . $date['hours'] : $date['hours'];
206 break;
207 case'i':
208 $out .= ( $date['minutes'] < 10 ) ? '0' . $date['minutes'] : $date['minutes'];
209 break;
210 case's':
211 $out .= ( $date['seconds'] < 10 ) ? '0' . $date['seconds'] : $date['seconds'];
212 break;
213 //full date time
214 case'c':
215 $out = $date['year'] . '/' . $date['mon'] . '/' . $date['mday'] . ' ' . $date['hours'] . ':' . ( ( $date['minutes'] < 10 ) ? '0' . $date['minutes'] : $date['minutes'] ) . ':' . ( ( $date['seconds'] < 10 ) ? '0' . $date['seconds'] : $date['seconds'] );//2004-02-12T15:19:21+00:00
216 break;
217 case'r':
218 $out = $this->persian_day_names[ $date['wday'] ] . ',' . $date['mday'] . ' ' . $this->persian_month_names[ (int) $date['mon'] ] . ' ' . $date['year'] . ' ' . $date['hours'] . ':' . ( ( $date['minutes'] < 10 ) ? '0' . $date['minutes'] : $date['minutes'] ) . ':' . ( ( $date['seconds'] < 10 ) ? '0' . $date['seconds'] : $date['seconds'] );//Thu, 21 Dec 2000 16:01:07
219 break;
220 case'U':
221 $out = $timestamp;
222 break;
223 //others
224 case'e':
225 case'I':
226 case'i':
227 case'O':
228 case'P':
229 case'T':
230 case'Z':
231 case'u':
232 break;
233 default:
234 $out .= $format[ $i ];
235 }
236 }
237 if ( $lang == 'per' ) {
238 return self::trim_number( $out );
239 } else {
240 return $out;
241 }
242 }
243
244 /**
245 * bn_parsidate::gregorian_to_persian()
246 * convert gregorian date to persian date
247 *
248 * @param mixed $gy
249 * @param mixed $gm
250 * @param mixed $gd
251 *
252 * @return array
253 */
254 function gregorian_to_persian( $gy, $gm, $gd ) {
255 $dayofyear = $this->g_days_sum_month[ (int) $gm ] + $gd;
256 if ( self::IsLeapYear( $gy ) and $gm > 2 ) {
257 $dayofyear ++;
258 }
259 $d_33 = (int) ( ( ( $gy - 16 ) % 132 ) * 0.0305 );
260 $leap = $gy % 4;
261 $a = ( ( $d_33 == 1 or $d_33 == 2 ) and ( $d_33 == $leap or $leap == 1 ) ) ? 78 : ( ( $d_33 == 3 and $leap == 0 ) ? 80 : 79 );
262 $b = ( $d_33 == 3 or $d_33 < ( $leap - 1 ) or $leap == 0 ) ? 286 : 287;
263 if ( (int) ( ( $gy - 10 ) / 63 ) == 30 ) {
264 $b --;
265 $a ++;
266 }
267 if ( $dayofyear > $a ) {
268 $jy = $gy - 621;
269 $jd = $dayofyear - $a;
270 } else {
271 $jy = $gy - 622;
272 $jd = $dayofyear + $b;
273 }
274 for ( $i = 0; $i < 11 and $jd > $this->j_days_in_month[ $i ]; $i ++ ) {
275 $jd -= $this->j_days_in_month[ $i ];
276 }
277 $jm = ++ $i;
278
279 return array( $jy, strlen( $jm ) == 1 ? '0' . $jm : $jm, strlen( $jd ) == 1 ? '0' . $jd : $jd );
280 }
281
282 /**
283 * Get day of the week shamsi/jalali
284 * @author Parsa Kafi
285 *
286 * @param int $wday
287 *
288 * @return int
289 */
290 private function week_day( $wday ) {
291 if ( $wday == 6 ) {
292 return 0;
293 } else {
294 return ++ $wday;
295 }
296 }
297
298 /**
299 * bn_parsidate::trim_number()
300 * convert english number to persian number
301 *
302 * @param mixed $num
303 * @param string $sp
304 *
305 * @return string
306 */
307 public function trim_number( $num, $sp = '٫' ) {
308 $eng = array( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' );
309 $per = array( '۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹', $sp );
310 $number = filter_var( $num, FILTER_SANITIZE_NUMBER_INT );
311
312 return empty( $number ) ? str_replace( $per, $eng, $num ) : str_replace( $eng, $per, $num );
313 }
314
315 /**
316 * bn_parsidate::getInstance()
317 * create instance of bn_parsidate class
318 *
319 * @return instance
320 */
321 public static function getInstance() {
322 if ( ! isset( self::$instance ) ) {
323 self::$instance = new self();
324 }
325
326 return self::$instance;
327 }
328
329 /**
330 * bn_parsidate::gregurian_date()
331 * convert persian datetime to gregorian datetime
332 *
333 * @param mixed $format
334 * @param mixed $persiandate
335 *
336 * @return mixed
337 */
338 public function gregurian_date( $format, $persiandate ) {
339 preg_match_all( '!\d+!', $persiandate, $matches );
340 $matches = $matches[0];
341 list( $year, $mon, $day ) = self::persian_to_gregorian( $matches[0], $matches[1], $matches[2] );
342
343 return date( $format, mktime( ( isset( $matches[3] ) ? $matches[3] : 0 ), ( isset( $matches[4] ) ? $matches[4] : 0 ), ( isset( $matches[5] ) ? $matches[5] : 0 ), $mon, $day, $year ) );
344 }
345
346 /**
347 * bn_parsidate::persian_to_gregorian()
348 * convert persian date to gregorian date
349 *
350 * @param mixed $jy
351 * @param mixed $jm
352 * @param mixed $jd
353 *
354 * @return array
355 */
356 public function persian_to_gregorian( $jy, $jm, $jd ) {
357 $doyj = ( $jm - 2 > - 1 ? $this->j_days_sum_month[ (int) $jm ] + $jd : $jd );
358 $d4 = ( $jy + 1 ) % 4;
359 $d33 = (int) ( ( ( $jy - 55 ) % 132 ) * .0305 );
360 $a = ( $d33 != 3 and $d4 <= $d33 ) ? 287 : 286;
361 $b = ( ( $d33 == 1 or $d33 == 2 ) and ( $d33 == $d4 or $d4 == 1 ) ) ? 78 : ( ( $d33 == 3 and $d4 == 0 ) ? 80 : 79 );
362 if ( (int) ( ( $jy - 19 ) / 63 ) == 20 ) {
363 $a --;
364 $b ++;
365 }
366 if ( $doyj <= $a ) {
367 $gy = $jy + 621;
368 $gd = $doyj + $b;
369 } else {
370 $gy = $jy + 622;
371 $gd = $doyj - $a;
372 }
373 foreach ( array( 0, 31, ( $gy % 4 == 0 ) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ) as $gm => $days ) {
374 if ( $gd <= $days ) {
375 break;
376 }
377 $gd -= $days;
378 }
379
380 return array( $gy, $gm, $gd );
381 }
382 }
383
384 /*
385 * parsidate function
386 */
387 /**
388 * parsidate()
389 * convert gregorian datetime to persian datetime
390 *
391 * @param mixed $input
392 * @param string $datetime
393 * @param string $lang
394 *
395 * @return datetime
396 */
397 function parsidate( $input, $datetime = 'now', $lang = 'per' ) {
398 $bndate = bn_parsidate::getInstance();
399 $bndate = $bndate->persian_date( $input, $datetime, $lang );
400
401 return $bndate;
402 }
403
404 /**
405 * gregdate()
406 * convert persian datetime to gregorian datetime
407 *
408 * @param mixed $input
409 * @param mixed $datetime
410 *
411 * @return datetime
412 */
413 function gregdate( $input, $datetime ) {
414 $bndate = bn_parsidate::getInstance();
415 $bndate = $bndate->gregurian_date( $input, $datetime );
416
417 return $bndate;
418 }
419