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