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