PluginProbe ʕ •ᴥ•ʔ
پارسی دیت – Parsi Date / 1.3
پارسی دیت – Parsi Date v1.3
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 / lib / parsidate.php
wp-parsidate / lib Last commit date
functions.php 12 years ago index.php 12 years ago parsidate.php 12 years ago
parsidate.php
273 lines
1 <?php
2 ob_start();
3
4 class bn_parsidate
5 {
6 protected static $instance;
7 private $persian_month_names=array('','فروردین','اردیبهشت','خرداد','تیر','�
8 رداد','شهریور','�
9 هر','آبان','آذر','دی','به�
10 ن','اسفند');
11 private $persian_short_month_names=array('','فرو','ارد','خرد','تیر','�
12 رد','شهر','�
13 هر','آبا','آذر','دی','به�
14 ','اسف');
15 private $sesson=array('بهار','تابستان','پاییز','ز�
16 ستان');
17
18 private $persian_day_names=array('یکشنبه','دوشنبه','سه شنبه','چهارشنبه','پنجشنبه','ج�
19 عه','شنبه');
20 private $persian_day_small=array("ی","د","س","چ","پ","ج","ش");
21
22 private $j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
23 private $j_days_sum_month = array(0,0,31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 365);
24
25 private $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
26 private $g_days_leap_month = array(31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
27 private $g_days_sum_month = array(0,0,31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365);
28
29 public static function getInstance()
30 {
31 if (!isset(self::$instance))
32 self::$instance = new self();
33 return self::$instance;
34 }
35
36 private function IsLeapYear($year)
37 {
38 if((($year%4)==0 && ($year%100)!=0)||(($year%400)==0)&&($year%100)==0)
39 return true;
40 else
41 return false;
42 }
43
44 public function persian_to_gregorian($jy,$jm,$jd)
45 {
46 $gd=($jm-2>-1?$this->j_days_sum_month[intval($jm)]+$jd:$jd);
47 $gy=$jy+621;
48 if($gd>286)
49 $gy++;
50 if(self::IsLeapYear($gy-1)&& 286<$gd)
51 $gd--;
52 if($gd>286)
53 $gd-=286;
54 else
55 $gd+=79;
56 if(self::IsLeapYear($gy))
57 {
58 for($gm=0;$gd>$this->g_days_leap_month[$gm];$gm++)
59 $gd-=$this->g_days_leap_month[$gm];
60 }
61 else
62 {
63 for($gm=0;$gd>$this->g_days_in_month[$gm];$gm++)
64 $gd-=$this->g_days_in_month[$gm];
65 }
66 $gm++;
67 return array($gy,$gm,$gd);
68 }
69
70 public function gregorian_to_persian($gy,$gm,$gd)
71 {
72 $dayofyear=$this->g_days_sum_month[$gm]+$gd;
73 $leap=self::IsLeapYear($gy-1);
74 $leab=self::IsLeapYear($gy);
75 if($leap and $gm>2)
76 ++$gd;
77 if($dayofyear>79)
78 {
79 $jd=($leab)?$dayofyear-78:$dayofyear-79;
80 $jy=$gy-621;
81 for($i=0;$jd>$this->j_days_in_month[$i];$i++)
82 $jd-=$this->j_days_in_month[$i];
83 }
84 else
85 {
86 $jd=($leap||($leab&&$gm>2))?287+$dayofyear:286+$dayofyear;
87 $jy=$gy-622;
88 if($jd==366)
89 return array($jy,12,30);
90 for($i=0;$jd>$this->j_days_in_month[$i];$i++)
91 $jd-=$this->j_days_in_month[$i];
92 }
93 $jm=++$i;
94 return array($jy,$jm,$jd);
95 }
96
97 public function trim_number($num,$sp='٫')
98 {
99 $eng=array('0','1','2','3','4','5','6','7','8','9','.');
100 $per=array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹',$sp);
101 $number=filter_var($num, FILTER_SANITIZE_NUMBER_INT);
102 return empty($number)?str_replace($per,$eng,$num):str_replace($eng,$per,$num);
103 }
104
105 public function persian_date($format,$date='now',$lang='per')
106 {
107 $j_days_in_month = array(31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 365);
108 if(strtotime($date)){
109 $timestamp=strtotime($date);
110 }else{
111 $timestamp = $date ;
112 }
113
114 $date=getdate($timestamp);
115 list($date['year'],$date['mon'],$date['mday'])=self::gregorian_to_persian($date['year'],$date['mon'],$date['mday']);
116
117 $out='';
118 for($i=0;$i<strlen($format);$i++)
119 {
120 Switch($format[$i])
121 {
122 //day
123 case 'd':
124 $out.=($date['mday']<10)?'0'.$date['mday']:$date['mday'];
125 break;
126 case 'D':
127 $out.=$this->persian_day_small[$date['wday']];
128 break;
129 case'l':
130 $out.=$this->persian_day_names[$date['wday']];
131 break;
132 case 'j':
133 $out.=$date['mday'];
134 break;
135 case'N':
136 $out.=$date['mday']+1;
137 break;
138 case'w':
139 $out.=$date['mday'];
140 break;
141 case'z':
142 $out.=$this->j_days_in_month[$date['mon']]+$date['mday'];
143 break;
144 //week
145 case'W':
146 $yday=$this->j_days_sum_month[$date['mon']-1]+$date['mday'];
147 $out.=intval($yday/7);
148 break;
149 //month
150 case'f':
151 $mon=$date['mon'];
152 switch($mon)
153 {
154 case($mon<4):
155 $out.=$this->sesson[0];
156 break;
157 case($mon<7):
158 $out.=$this->sesson[1];
159 break;
160 case($mon<10):
161 $out.=$this->sesson[2];
162 break;
163 case($mon>9):
164 $out.=$this->sesson[3];
165 break;
166 }
167 break;
168 case'F':
169 $out.=$this->persian_month_names[$date['mon']];
170 break;
171 case'm':
172 $out.=($date['mon']<10)?'0'.$date['mon']:$date['mon'];
173 break;
174 case'M':
175 $out.=$this->persian_short_month_names[$date['mon']];
176 break;
177 case'n':
178 $out.=$date['mon'];
179 break;
180 case'S':
181 $out.='ا�
182 ';
183 break;
184 case't':
185 $out.=$this->j_days_in_month[$date['mon']];
186 break;
187 //year
188 case'L':
189 $out.=(($date['year']%4)==0)?1:0;
190 break;
191 case'o':case'Y':
192 $out.=$date['year'];
193 break;
194 case'y':
195 $out.=substr($date['year'],2,2);
196 break;
197 //time
198 case'a':
199 $out.=($date['hours']<12)?'ق.ظ':'ب.ظ';
200 break;
201 case'A':
202 $out.=($date['hours']<12)?'قبل از ظهر':'بعد از ظهر';
203 break;
204 case'B':
205 $out.=(int)(1+($date['mon']/3));
206 break;
207 case'g':
208 $out.=($date['hours']>12)?$date['hours']-12:$date['hours'];
209 break;
210 case'G':
211 $out.=$date['hours'];
212 break;
213 case'h':
214 $hour=($date['hours']>12)?$date['hours']-12:$date['hours'];
215 $out.=($hour<10)?"0$hour":$hour;
216 break;
217 case'H':
218 $out.=($date['hours']<10)?'0'.$date['hours']:$date['hours'];
219 break;
220 case'i':
221 $out.=($date['minutes']<10)?'0'.$date['minutes']:$date['minutes'];
222 break;
223 case's':
224 $out.=($date['seconds']<10)?'0'.$date['seconds']:$date['seconds'];
225 break;
226 //full date time
227 case'c':
228 $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
229 break;
230 case'r':
231 $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
232 break;
233 case'U':
234 $out=$timestamp;
235 break;
236 //others
237 case'e':case'I':case'i':case'O':case'P':case'T':case'Z':case'u':break;
238 default:$out.=$format[$i];
239 }
240 }
241 if($lang=='per')
242 return self::trim_number($out);
243 else
244 return $out;
245 }
246
247 public function gregurian_date($format,$persiandate)
248 {
249 preg_match_all('!\d+!', $persiandate, $matches);
250 $matches=$matches[0];
251 list($year,$mon,$day)=self::persian_to_gregorian($matches[0],$matches[1],$matches[2]);
252 return date($format,mktime($matches[3],$matches[4],$matches[5],$mon,$day,$year,-1));
253 }
254 }
255
256
257 /*
258 * parsidate function
259 */
260 function parsidate($input,$datetime='now',$lang='per')
261 {
262 $bndate =bn_parsidate::getInstance();
263 $bndate = $bndate->persian_date($input,$datetime,$lang);
264 return $bndate;
265 }
266
267 function gregdate($input,$datetime)
268 {
269 $bndate =bn_parsidate::getInstance();
270 $bndate = $bndate->gregurian_date($input,$datetime);
271 return $bndate;
272 }
273 ?>