Passed
Push — main ( 1f3d08...95c480 )
by Miaad
10:28
created

jdf::jalali_to_gregorian()   C

Complexity

Conditions 11
Paths 288

Size

Total Lines 35
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
cc 11
eloc 30
c 1
b 0
f 1
nc 288
nop 4
dl 0
loc 35
rs 5.3833

How to fix   Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace BPT\external;
4
5
/**
6
 * Time and date class for persian calendar(Solar calendar, Shamsi calendar)
7
 *
8
 * @Author : Reza Gholampanahi & WebSite : http://jdf.scr.ir
9
 * @License: GNU/LGPL _ Open Source & Free : [all functions]
10
 * @Version: 2.76 =>[ 1399/11/28 = 1442/07/04 = 2021/02/16 ]
11
 */
12
class jdf {
13
    public static function jdate ($format, $timestamp = '', $none = '', $time_zone = 'Asia/Tehran', $tr_num = 'fa') {
0 ignored issues
show
Unused Code introduced by
The parameter $none is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

13
    public static function jdate ($format, $timestamp = '', /** @scrutinizer ignore-unused */ $none = '', $time_zone = 'Asia/Tehran', $tr_num = 'fa') {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
14
        $T_sec = 0;/* <= رفع خطاي زمان سرور ، با اعداد '+' و '-' بر حسب ثانيه */
15
        if ($time_zone != 'local') date_default_timezone_set(($time_zone === '') ? 'Asia/Tehran' : $time_zone);
16
        $ts = $T_sec + (($timestamp === '') ? time() : self::tr_num($timestamp));
17
        $date = explode('_', date('H_i_j_n_O_P_s_w_Y', $ts));
18
        [$j_y, $j_m, $j_d] = self::gregorian_to_jalali($date[8], $date[3], $date[2]);
19
        $doy = ($j_m < 7) ? (($j_m - 1) * 31) + $j_d - 1 : (($j_m - 7) * 30) + $j_d + 185;
20
        $kab = (((($j_y + 12) % 33) % 4) == 1) ? 1 : 0;
21
        $sl = strlen($format);
22
        $out = '';
23
        for ($i = 0; $i < $sl; $i++) {
24
            $sub = substr($format, $i, 1);
25
            if ($sub == '\\') {
26
                $out .= substr($format, ++$i, 1);
27
                continue;
28
            }
29
            switch ($sub) {
30
31
                case 'E':
32
                case 'R':
33
                case 'x':
34
                case 'X':
35
                    $out .= 'http://jdf.scr.ir';
36
                    break;
37
                case 'B':
38
                case 'e':
39
                case 'g':
40
                case 'G':
41
                case 'h':
42
                case 'I':
43
                case 'T':
44
                case 'u':
45
                case 'Z':
46
                    $out .= date($sub, $ts);
47
                    break;
48
                case 'a':
49
                    $out .= ($date[0] < 12) ? 'ق.ظ' : 'ب.ظ';
50
                    break;
51
                case 'A':
52
                    $out .= ($date[0] < 12) ? 'قبل از ظهر' : 'بعد از ظهر';
53
                    break;
54
                case 'b':
55
                    $out .= (int) ($j_m / 3.1) + 1;
56
                    break;
57
                case 'c':
58
                    $out .= $j_y . '/' . $j_m . '/' . $j_d . ' ،' . $date[0] . ':' . $date[1] . ':' . $date[6] . ' ' . $date[5];
59
                    break;
60
                case 'C':
61
                    $out .= (int) (($j_y + 99) / 100);
62
                    break;
63
                case 'd':
64
                    $out .= ($j_d < 10) ? '0' . $j_d : $j_d;
65
                    break;
66
                case 'D':
67
                    $out .= self::jdate_words(['kh' => $date[7]], ' ');
68
                    break;
69
                case 'f':
70
                    $out .= self::jdate_words(['ff' => $j_m], ' ');
71
                    break;
72
                case 'F':
73
                    $out .= self::jdate_words(['mm' => $j_m], ' ');
74
                    break;
75
                case 'H':
76
                    $out .= $date[0];
77
                    break;
78
                case 'i':
79
                    $out .= $date[1];
80
                    break;
81
                case 'j':
82
                    $out .= $j_d;
83
                    break;
84
                case 'J':
85
                    $out .= self::jdate_words(['rr' => $j_d], ' ');
86
                    break;
87
                case 'k';
88
                    $out .= self::tr_num(100 - (int) ($doy / ($kab + 365.24) * 1000) / 10, $tr_num);
89
                    break;
90
                case 'K':
91
                    $out .= self::tr_num((int) ($doy / ($kab + 365.24) * 1000) / 10, $tr_num);
92
                    break;
93
                case 'l':
94
                    $out .= self::jdate_words(['rh' => $date[7]], ' ');
95
                    break;
96
                case 'L':
97
                    $out .= $kab;
98
                    break;
99
                case 'm':
100
                    $out .= ($j_m > 9) ? $j_m : '0' . $j_m;
101
                    break;
102
                case 'M':
103
                    $out .= self::jdate_words(['km' => $j_m], ' ');
104
                    break;
105
                case 'n':
106
                    $out .= $j_m;
107
                    break;
108
                case 'N':
109
                    $out .= $date[7] + 1;
110
                    break;
111
                case 'o':
112
                    $jdw = ($date[7] == 6) ? 0 : $date[7] + 1;
113
                    $dny = 364 + $kab - $doy;
114
                    $out .= ($jdw > ($doy + 3) and $doy < 3) ? $j_y - 1 : (((3 - $dny) > $jdw and $dny < 3) ? $j_y + 1 : $j_y);
115
                    break;
116
                case 'O':
117
                    $out .= $date[4];
118
                    break;
119
                case 'p':
120
                    $out .= self::jdate_words(['mb' => $j_m], ' ');
121
                    break;
122
                case 'P':
123
                    $out .= $date[5];
124
                    break;
125
                case 'q':
126
                    $out .= self::jdate_words(['sh' => $j_y], ' ');
127
                    break;
128
                case 'Q':
129
                    $out .= $kab + 364 - $doy;
130
                    break;
131
                case 'r':
132
                    $key = self::jdate_words(['rh' => $date[7], 'mm' => $j_m]);
133
                    $out .= $date[0] . ':' . $date[1] . ':' . $date[6] . ' ' . $date[4] . ' ' . $key['rh'] . '، ' . $j_d . ' ' . $key['mm'] . ' ' . $j_y;
134
                    break;
135
                case 's':
136
                    $out .= $date[6];
137
                    break;
138
                case 'S':
139
                    $out .= 'ام';
140
                    break;
141
                case 't':
142
                    $out .= ($j_m != 12) ? (31 - (int) ($j_m / 6.5)) : ($kab + 29);
143
                    break;
144
                case 'U':
145
                    $out .= $ts;
146
                    break;
147
                case 'v':
148
                    $out .= self::jdate_words(['ss' => ($j_y % 100)], ' ');
149
                    break;
150
                case 'V':
151
                    $out .= self::jdate_words(['ss' => $j_y], ' ');
152
                    break;
153
                case 'w':
154
                    $out .= ($date[7] == 6) ? 0 : $date[7] + 1;
155
                    break;
156
                case 'W':
157
                    $avs = (($date[7] == 6) ? 0 : $date[7] + 1) - ($doy % 7);
158
                    if ($avs < 0) $avs += 7;
159
                    $num = (int) (($doy + $avs) / 7);
160
                    if ($avs < 4) {
161
                        $num++;
162
                    }
163
                    elseif ($num < 1) {
164
                        $num = ($avs == 4 or $avs == ((((($j_y % 33) % 4) - 2) == ((int) (($j_y % 33) * 0.05))) ? 5 : 4)) ? 53 : 52;
165
                    }
166
                    $aks = $avs + $kab;
167
                    if ($aks == 7) $aks = 0;
168
                    $out .= (($kab + 363 - $doy) < $aks and $aks < 3) ? '01' : (($num < 10) ? '0' . $num : $num);
169
                    break;
170
                case 'y':
171
                    $out .= substr($j_y, 2, 2);
172
                    break;
173
                case 'Y':
174
                    $out .= $j_y;
175
                    break;
176
                case 'z':
177
                    $out .= $doy;
178
                    break;
179
                default:
180
                    $out .= $sub;
181
            }
182
        }
183
        return ($tr_num != 'en') ? self::tr_num($out, 'fa', '.') : $out;
184
    }
185
    public static function jstrftime ($format, $timestamp = '', $none = '', $time_zone = 'Asia/Tehran', $tr_num = 'fa') {
0 ignored issues
show
Unused Code introduced by
The parameter $none is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

185
    public static function jstrftime ($format, $timestamp = '', /** @scrutinizer ignore-unused */ $none = '', $time_zone = 'Asia/Tehran', $tr_num = 'fa') {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
186
        $T_sec = 0;/* <= رفع خطاي زمان سرور ، با اعداد '+' و '-' بر حسب ثانيه */
187
        if ($time_zone != 'local') date_default_timezone_set(($time_zone === '') ? 'Asia/Tehran' : $time_zone);
188
        $ts = $T_sec + (($timestamp === '') ? time() : self::tr_num($timestamp));
189
        $date = explode('_', date('h_H_i_j_n_s_w_Y', $ts));
190
        [$j_y, $j_m, $j_d] = self::gregorian_to_jalali($date[7], $date[4], $date[3]);
191
        $doy = ($j_m < 7) ? (($j_m - 1) * 31) + $j_d - 1 : (($j_m - 7) * 30) + $j_d + 185;
192
        $kab = (((($j_y + 12) % 33) % 4) == 1) ? 1 : 0;
193
        $sl = strlen($format);
194
        $out = '';
195
        for ($i = 0; $i < $sl; $i++) {
196
            $sub = substr($format, $i, 1);
197
            if ($sub == '%') {
198
                $sub = substr($format, ++$i, 1);
199
            }
200
            else {
201
                $out .= $sub;
202
                continue;
203
            }
204
            switch ($sub) {
205
206
                /* Day */
207
                case 'a':
208
                $out .= self::jdate_words(['kh' => $date[6]], ' ');
209
                break;
210
                case 'A':
211
                    $out .= self::jdate_words(['rh' => $date[6]], ' ');
212
                    break;
213
                case 'd':
214
                    $out .= ($j_d < 10) ? '0' . $j_d : $j_d;
215
                    break;
216
                case 'e':
217
                    $out .= ($j_d < 10) ? ' ' . $j_d : $j_d;
218
                    break;
219
                case 'j':
220
                    $out .= str_pad($doy + 1, 3, 0, STR_PAD_LEFT);
221
                    break;
222
                case 'u':
223
                    $out .= $date[6] + 1;
224
                    break;
225
                case 'w':
226
                    $out .= ($date[6] == 6) ? 0 : $date[6] + 1;
227
                    break;
228
                /* Week */
229
                case 'U':
230
                $avs = (($date[6] < 5) ? $date[6] + 2 : $date[6] - 5) - ($doy % 7);
231
                if ($avs < 0) $avs += 7;
232
                $num = (int) (($doy + $avs) / 7) + 1;
233
                if ($avs > 3 or $avs == 1) $num--;
234
                $out .= ($num < 10) ? '0' . $num : $num;
235
                break;
236
                case 'V':
237
                    $avs = (($date[6] == 6) ? 0 : $date[6] + 1) - ($doy % 7);
238
                    if ($avs < 0) $avs += 7;
239
                    $num = (int) (($doy + $avs) / 7);
240
                    if ($avs < 4) {
241
                        $num++;
242
                    }
243
                    elseif ($num < 1) {
244
                        $num = ($avs == 4 or $avs == ((((($j_y % 33) % 4) - 2) == ((int) (($j_y % 33) * 0.05))) ? 5 : 4)) ? 53 : 52;
245
                    }
246
                    $aks = $avs + $kab;
247
                    if ($aks == 7) $aks = 0;
248
                    $out .= (($kab + 363 - $doy) < $aks and $aks < 3) ? '01' : (($num < 10) ? '0' . $num : $num);
249
                    break;
250
                case 'W':
251
                    $avs = (($date[6] == 6) ? 0 : $date[6] + 1) - ($doy % 7);
252
                    if ($avs < 0) $avs += 7;
253
                    $num = (int) (($doy + $avs) / 7) + 1;
254
                    if ($avs > 3) $num--;
255
                    $out .= ($num < 10) ? '0' . $num : $num;
256
                    break;
257
                /* Month */
258
                case 'b':
259
                case 'h':
260
                    $out .= self::jdate_words(['km' => $j_m], ' ');
261
                    break;
262
                case 'B':
263
                    $out .= self::jdate_words(['mm' => $j_m], ' ');
264
                    break;
265
                case 'm':
266
                    $out .= ($j_m > 9) ? $j_m : '0' . $j_m;
267
                    break;
268
                /* Year */
269
                case 'C':
270
                $tmp = (int) ($j_y / 100);
271
                $out .= ($tmp > 9) ? $tmp : '0' . $tmp;
272
                break;
273
                case 'g':
274
                    $jdw = ($date[6] == 6) ? 0 : $date[6] + 1;
275
                    $dny = 364 + $kab - $doy;
276
                    $out .= substr(($jdw > ($doy + 3) and $doy < 3) ? $j_y - 1 : (((3 - $dny) > $jdw and $dny < 3) ? $j_y + 1 : $j_y), 2, 2);
277
                    break;
278
                case 'G':
279
                    $jdw = ($date[6] == 6) ? 0 : $date[6] + 1;
280
                    $dny = 364 + $kab - $doy;
281
                    $out .= ($jdw > ($doy + 3) and $doy < 3) ? $j_y - 1 : (((3 - $dny) > $jdw and $dny < 3) ? $j_y + 1 : $j_y);
282
                    break;
283
                case 'y':
284
                    $out .= substr($j_y, 2, 2);
285
                    break;
286
                case 'Y':
287
                    $out .= $j_y;
288
                    break;
289
                /* Time */
290
                case 'H':
291
                $out .= $date[1];
292
                break;
293
                case 'I':
294
                    $out .= $date[0];
295
                    break;
296
                case 'l':
297
                    $out .= ($date[0] > 9) ? $date[0] : ' ' . (int) $date[0];
298
                    break;
299
                case 'M':
300
                    $out .= $date[2];
301
                    break;
302
                case 'p':
303
                    $out .= ($date[1] < 12) ? 'قبل از ظهر' : 'بعد از ظهر';
304
                    break;
305
                case 'P':
306
                    $out .= ($date[1] < 12) ? 'ق.ظ' : 'ب.ظ';
307
                    break;
308
                case 'r':
309
                    $out .= $date[0] . ':' . $date[2] . ':' . $date[5] . ' ' . (($date[1] < 12) ? 'قبل از ظهر' : 'بعد از ظهر');
310
                    break;
311
                case 'R':
312
                    $out .= $date[1] . ':' . $date[2];
313
                    break;
314
                case 'S':
315
                    $out .= $date[5];
316
                    break;
317
                case 'T':
318
                    $out .= $date[1] . ':' . $date[2] . ':' . $date[5];
319
                    break;
320
                case 'X':
321
                    $out .= $date[0] . ':' . $date[2] . ':' . $date[5];
322
                    break;
323
                case 'z':
324
                    $out .= date('O', $ts);
325
                    break;
326
                case 'Z':
327
                    $out .= date('T', $ts);
328
                    break;
329
                /* Time and Date Stamps */
330
                case 'c':
331
                $key = self::jdate_words(['rh' => $date[6], 'mm' => $j_m]);
332
                $out .= $date[1] . ':' . $date[2] . ':' . $date[5] . ' ' . date('P', $ts) . ' ' . $key['rh'] . '، ' . $j_d . ' ' . $key['mm'] . ' ' . $j_y;
333
                break;
334
                case 'D':
335
                    $out .= substr($j_y, 2, 2) . '/' . (($j_m > 9) ? $j_m : '0' . $j_m) . '/' . (($j_d < 10) ? '0' . $j_d : $j_d);
336
                    break;
337
                case 'F':
338
                    $out .= $j_y . '-' . (($j_m > 9) ? $j_m : '0' . $j_m) . '-' . (($j_d < 10) ? '0' . $j_d : $j_d);
339
                    break;
340
                case 's':
341
                    $out .= $ts;
342
                    break;
343
                case 'x':
344
                    $out .= substr($j_y, 2, 2) . '/' . (($j_m > 9) ? $j_m : '0' . $j_m) . '/' . (($j_d < 10) ? '0' . $j_d : $j_d);
345
                    break;
346
                /* Miscellaneous */
347
                case 'n':
348
                $out .= "\n";
349
                break;
350
                case 't':
351
                    $out .= "\t";
352
                    break;
353
                case '%':
354
                    $out .= '%';
355
                    break;
356
                default:
357
                    $out .= $sub;
358
            }
359
        }
360
        return ($tr_num != 'en') ? self::tr_num($out, 'fa', '.') : $out;
361
    }
362
    public static function jmktime ($h = '', $m = '', $s = '', $jm = '', $jd = '', $jy = '', $none = '', $timezone = 'Asia/Tehran') {
0 ignored issues
show
Unused Code introduced by
The parameter $none is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

362
    public static function jmktime ($h = '', $m = '', $s = '', $jm = '', $jd = '', $jy = '', /** @scrutinizer ignore-unused */ $none = '', $timezone = 'Asia/Tehran') {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
363
        if ($timezone != 'local') date_default_timezone_set($timezone);
364
        if ($h === '') {
365
            return time();
366
        }
367
        else {
368
            [
369
                $h,
370
                $m,
371
                $s,
372
                $jm,
373
                $jd,
374
                $jy
375
            ] = explode('_', self::tr_num($h . '_' . $m . '_' . $s . '_' . $jm . '_' . $jd . '_' . $jy));
376
            if ($m === '') {
377
                return mktime($h);
0 ignored issues
show
Bug introduced by
$h of type string is incompatible with the type integer expected by parameter $hour of mktime(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

377
                return mktime(/** @scrutinizer ignore-type */ $h);
Loading history...
378
            }
379
            else {
380
                if ($s === '') {
381
                    return mktime($h, $m);
0 ignored issues
show
Bug introduced by
$m of type string is incompatible with the type integer expected by parameter $minute of mktime(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

381
                    return mktime($h, /** @scrutinizer ignore-type */ $m);
Loading history...
382
                }
383
                else {
384
                    if ($jm === '') {
385
                        return mktime($h, $m, $s);
0 ignored issues
show
Bug introduced by
$s of type string is incompatible with the type integer expected by parameter $second of mktime(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

385
                        return mktime($h, $m, /** @scrutinizer ignore-type */ $s);
Loading history...
386
                    }
387
                    else {
388
                        $jdate = explode('_', self::jdate('Y_j', '', '', $timezone, 'en'));
389
                        if ($jd === '') {
390
                            [$gy, $gm, $gd] = self::jalali_to_gregorian($jdate[0], $jm, $jdate[1]);
391
                            return mktime($h, $m, $s, $gm);
392
                        }
393
                        else {
394
                            if ($jy === '') {
395
                                [$gy, $gm, $gd] = self::jalali_to_gregorian($jdate[0], $jm, $jd);
396
                                return mktime($h, $m, $s, $gm, $gd);
397
                            }
398
                            else {
399
                                [$gy, $gm, $gd] = self::jalali_to_gregorian($jy, $jm, $jd);
400
                                return mktime($h, $m, $s, $gm, $gd, $gy);
401
                            }
402
                        }
403
                    }
404
                }
405
            }
406
        }
407
    }
408
    public static function jgetdate ($timestamp = '', $none = '', $timezone = 'Asia/Tehran', $tn = 'en') {
0 ignored issues
show
Unused Code introduced by
The parameter $none is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

408
    public static function jgetdate ($timestamp = '', /** @scrutinizer ignore-unused */ $none = '', $timezone = 'Asia/Tehran', $tn = 'en') {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
409
        $ts = ($timestamp === '') ? time() : self::tr_num($timestamp);
410
        $jdate = explode('_', self::jdate('F_G_i_j_l_n_s_w_Y_z', $ts, '', $timezone, $tn));
411
        return [
412
            'seconds' => self::tr_num((int) self::tr_num($jdate[6]), $tn),
413
            'minutes' => self::tr_num((int) self::tr_num($jdate[2]), $tn),
414
            'hours'   => $jdate[1],
415
            'mday'    => $jdate[3],
416
            'wday'    => $jdate[7],
417
            'mon'     => $jdate[5],
418
            'year'    => $jdate[8],
419
            'yday'    => $jdate[9],
420
            'weekday' => $jdate[4],
421
            'month'   => $jdate[0],
422
            0         => self::tr_num($ts, $tn)
423
        ];
424
    }
425
    public static function jcheckdate ($jm, $jd, $jy) {
426
        [$jm, $jd, $jy] = explode('_', self::tr_num($jm . '_' . $jd . '_' . $jy));
427
        $l_d = ($jm == 12 and ((($jy + 12) % 33) % 4) != 1) ? 29 : (31 - (int) ($jm / 6.5));
428
        return ($jm > 12 or $jd > $l_d or $jm < 1 or $jd < 1 or $jy < 1) ? false : true;
429
    }
430
    public static function tr_num ($str, $mod = 'en', $mf = '٫') {
431
        $num_a = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.'];
432
        $key_a = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹', $mf];
433
        return ($mod == 'fa') ? str_replace($num_a, $key_a, $str) : str_replace($key_a, $num_a, $str);
434
    }
435
    public static function jdate_words ($array, $mod = '') {
436
        foreach ($array as $type => $num) {
437
            $num = (int) self::tr_num($num);
438
            switch ($type) {
439
440
                case 'ss':
441
                    $sl = strlen($num);
442
                    $xy3 = substr($num, 2 - $sl, 1);
443
                    $h3 = $h34 = $h4 = '';
444
                    if ($xy3 == 1) {
445
                        $p34 = '';
446
                        $k34 = ['ده', 'یازده', 'دوازده', 'سیزده', 'چهارده', 'پانزده', 'شانزده', 'هفده', 'هجده', 'نوزده'];
447
                        $h34 = $k34[substr($num, 2 - $sl, 2) - 10];
448
                    }
449
                    else {
450
                        $xy4 = substr($num, 3 - $sl, 1);
451
                        $p34 = ($xy3 == 0 or $xy4 == 0) ? '' : ' و ';
452
                        $k3 = ['', '', 'بیست', 'سی', 'چهل', 'پنجاه', 'شصت', 'هفتاد', 'هشتاد', 'نود'];
453
                        $h3 = $k3[$xy3];
454
                        $k4 = ['', 'یک', 'دو', 'سه', 'چهار', 'پنج', 'شش', 'هفت', 'هشت', 'نه'];
455
                        $h4 = $k4[$xy4];
456
                    }
457
                    $array[$type] = (($num > 99) ? str_replace(['12', '13', '14', '19', '20'], [
458
                                'هزار و دویست',
459
                                'هزار و سیصد',
460
                                'هزار و چهارصد',
461
                                'هزار و نهصد',
462
                                'دوهزار'
463
                            ], substr($num, 0, 2)) . ((substr($num, 2, 2) == '00') ? '' : ' و ') : '') . $h3 . $p34 . $h34 . $h4;
464
                    break;
465
                case 'mm':
466
                    $key = [
467
                        'فروردین',
468
                        'اردیبهشت',
469
                        'خرداد',
470
                        'تیر',
471
                        'مرداد',
472
                        'شهریور',
473
                        'مهر',
474
                        'آبان',
475
                        'آذر',
476
                        'دی',
477
                        'بهمن',
478
                        'اسفند'
479
                    ];
480
                    $array[$type] = $key[$num - 1];
481
                    break;
482
                case 'rr':
483
                    $key = [
484
                        'یک',
485
                        'دو',
486
                        'سه',
487
                        'چهار',
488
                        'پنج',
489
                        'شش',
490
                        'هفت',
491
                        'هشت',
492
                        'نه',
493
                        'ده',
494
                        'یازده',
495
                        'دوازده',
496
                        'سیزده',
497
                        'چهارده',
498
                        'پانزده',
499
                        'شانزده',
500
                        'هفده',
501
                        'هجده',
502
                        'نوزده',
503
                        'بیست',
504
                        'بیست و یک',
505
                        'بیست و دو',
506
                        'بیست و سه',
507
                        'بیست و چهار',
508
                        'بیست و پنج',
509
                        'بیست و شش',
510
                        'بیست و هفت',
511
                        'بیست و هشت',
512
                        'بیست و نه',
513
                        'سی',
514
                        'سی و یک'
515
                    ];
516
                    $array[$type] = $key[$num - 1];
517
                    break;
518
                case 'rh':
519
                    $key = ['یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'];
520
                    $array[$type] = $key[$num];
521
                    break;
522
                case 'sh':
523
                    $key = ['مار', 'اسب', 'گوسفند', 'میمون', 'مرغ', 'سگ', 'خوک', 'موش', 'گاو', 'پلنگ', 'خرگوش', 'نهنگ'];
524
                    $array[$type] = $key[$num % 12];
525
                    break;
526
                case 'mb':
527
                    $key = ['حمل', 'ثور', 'جوزا', 'سرطان', 'اسد', 'سنبله', 'میزان', 'عقرب', 'قوس', 'جدی', 'دلو', 'حوت'];
528
                    $array[$type] = $key[$num - 1];
529
                    break;
530
                case 'ff':
531
                    $key = ['بهار', 'تابستان', 'پاییز', 'زمستان'];
532
                    $array[$type] = $key[(int) ($num / 3.1)];
533
                    break;
534
                case 'km':
535
                    $key = ['فر', 'ار', 'خر', 'تی‍', 'مر', 'شه‍', 'مه‍', 'آب‍', 'آذ', 'دی', 'به‍', 'اس‍'];
536
                    $array[$type] = $key[$num - 1];
537
                    break;
538
                case 'kh':
539
                    $key = ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'];
540
                    $array[$type] = $key[$num];
541
                    break;
542
                default:
543
                    $array[$type] = $num;
544
            }
545
        }
546
        return ($mod === '') ? $array : implode($mod, $array);
547
    }
548
    public static function gregorian_to_jalali ($gy, $gm, $gd, $mod = '') {
549
        [$gy, $gm, $gd] = explode('_', self::tr_num($gy . '_' . $gm . '_' . $gd));/* <= Extra :اين سطر ، جزء تابع اصلي نيست */
550
        $g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];
551
        $gy2 = ($gm > 2) ? ($gy + 1) : $gy;
552
        $days = 355666 + (365 * $gy) + ((int) (($gy2 + 3) / 4)) - ((int) (($gy2 + 99) / 100)) + ((int) (($gy2 + 399) / 400)) + $gd + $g_d_m[$gm - 1];
553
        $jy = -1595 + (33 * ((int) ($days / 12053)));
554
        $days %= 12053;
555
        $jy += 4 * ((int) ($days / 1461));
556
        $days %= 1461;
557
        if ($days > 365) {
558
            $jy += (int) (($days - 1) / 365);
559
            $days = ($days - 1) % 365;
560
        }
561
        if ($days < 186) {
562
            $jm = 1 + (int) ($days / 31);
563
            $jd = 1 + ($days % 31);
564
        }
565
        else {
566
            $jm = 7 + (int) (($days - 186) / 30);
567
            $jd = 1 + (($days - 186) % 30);
568
        }
569
        return ($mod == '') ? [$jy, $jm, $jd] : $jy . $mod . $jm . $mod . $jd;
570
    }
571
    public static function jalali_to_gregorian ($jy, $jm, $jd, $mod = '') {
572
        [$jy, $jm, $jd] = explode('_', self::tr_num($jy . '_' . $jm . '_' . $jd));/* <= Extra :اين سطر ، جزء تابع اصلي نيست */
573
        $jy += 1595;
574
        $days = -355668 + (365 * $jy) + (((int) ($jy / 33)) * 8) + ((int) ((($jy % 33) + 3) / 4)) + $jd + (($jm < 7) ? ($jm - 1) * 31 : (($jm - 7) * 30) + 186);
575
        $gy = 400 * ((int) ($days / 146097));
576
        $days %= 146097;
577
        if ($days > 36524) {
578
            $gy += 100 * ((int) (--$days / 36524));
579
            $days %= 36524;
580
            if ($days >= 365) $days++;
581
        }
582
        $gy += 4 * ((int) ($days / 1461));
583
        $days %= 1461;
584
        if ($days > 365) {
585
            $gy += (int) (($days - 1) / 365);
586
            $days = ($days - 1) % 365;
587
        }
588
        $gd = $days + 1;
589
        $sal_a = [
590
            0,
591
            31,
592
            (($gy % 4 == 0 and $gy % 100 != 0) or ($gy % 400 == 0)) ? 29 : 28,
593
            31,
594
            30,
595
            31,
596
            30,
597
            31,
598
            31,
599
            30,
600
            31,
601
            30,
602
            31
603
        ];
604
        for ($gm = 0; $gm < 13 and $gd > $sal_a[$gm]; $gm++) $gd -= $sal_a[$gm];
605
        return ($mod == '') ? [$gy, $gm, $gd] : $gy . $mod . $gm . $mod . $gd;
606
    }
607
}