PluginProbe ʕ •ᴥ•ʔ
پارسی دیت – Parsi Date / 1.1
پارسی دیت – Parsi Date v1.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 / 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
271 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($dayofyear>79)
76 {
77 $jd=($leab)?$dayofyear-78:$dayofyear-79;
78 $jy=$gy-621;
79 for($i=0;$jd>$this->j_days_in_month[$i];$i++)
80 $jd-=$this->j_days_in_month[$i];
81 }
82 else
83 {
84 $jd=($leap||($leab&&$gm>2))?287+$dayofyear:286+$dayofyear;
85 $jy=$gy-622;
86 if($leap && $jd==366)
87 return array($jy,12,30);
88 for($i=0;$jd>$this->j_days_in_month[$i];$i++)
89 $jd-=$this->j_days_in_month[$i];
90 }
91 $jm=++$i;
92 return array($jy,$jm,$jd);
93 }
94
95 public function trim_number($num,$sp='٫')
96 {
97 $eng=array('0','1','2','3','4','5','6','7','8','9','.');
98 $per=array('۰','۱','۲','۳','۴','۵','۶','۷','۸','۹',$sp);
99 $number=filter_var($num, FILTER_SANITIZE_NUMBER_INT);
100 return empty($number)?str_replace($per,$eng,$num):str_replace($eng,$per,$num);
101 }
102
103 public function persian_date($format,$date='now',$lang='per')
104 {
105 $j_days_in_month = array(31, 62, 93, 124, 155, 186, 216, 246, 276, 306, 336, 365);
106 if(strtotime($date)){
107 $timestamp=strtotime($date);
108 }else{
109 $timestamp = $date ;
110 }
111
112 $date=getdate($timestamp);
113 list($date['year'],$date['mon'],$date['mday'])=self::gregorian_to_persian($date['year'],$date['mon'],$date['mday']);
114
115 $out='';
116 for($i=0;$i<strlen($format);$i++)
117 {
118 Switch($format[$i])
119 {
120 //day
121 case 'd':
122 $out.=($date['mday']<10)?'0'.$date['mday']:$date['mday'];
123 break;
124 case 'D':
125 $out.=$this->persian_day_small[$date['wday']];
126 break;
127 case'l':
128 $out.=$this->persian_day_names[$date['wday']];
129 break;
130 case 'j':
131 $out.=$date['mday'];
132 break;
133 case'N':
134 $out.=$date['mday']+1;
135 break;
136 case'w':
137 $out.=$date['mday'];
138 break;
139 case'z':
140 $out.=$this->j_days_in_month[$date['mon']]+$date['mday'];
141 break;
142 //week
143 case'W':
144 $yday=$this->j_days_sum_month[$date['mon']-1]+$date['mday'];
145 $out.=intval($yday/7);
146 break;
147 //month
148 case'f':
149 $mon=$date['mon'];
150 switch($mon)
151 {
152 case($mon<4):
153 $out.=$this->sesson[0];
154 break;
155 case($mon<7):
156 $out.=$this->sesson[1];
157 break;
158 case($mon<10):
159 $out.=$this->sesson[2];
160 break;
161 case($mon>9):
162 $out.=$this->sesson[3];
163 break;
164 }
165 break;
166 case'F':
167 $out.=$this->persian_month_names[$date['mon']];
168 break;
169 case'm':
170 $out.=($date['mon']<10)?'0'.$date['mon']:$date['mon'];
171 break;
172 case'M':
173 $out.=$this->persian_short_month_names[$date['mon']];
174 break;
175 case'n':
176 $out.=$date['mon'];
177 break;
178 case'S':
179 $out.='ا�
180 ';
181 break;
182 case't':
183 $out.=$this->j_days_in_month[$date['mon']];
184 break;
185 //year
186 case'L':
187 $out.=(($date['year']%4)==0)?1:0;
188 break;
189 case'o':case'Y':
190 $out.=$date['year'];
191 break;
192 case'y':
193 $out.=substr($date['year'],2,2);
194 break;
195 //time
196 case'a':
197 $out.=($date['hours']<12)?'ق.ظ':'ب.ظ';
198 break;
199 case'A':
200 $out.=($date['hours']<12)?'قبل از ظهر':'بعد از ظهر';
201 break;
202 case'B':
203 $out.=(int)(1+($date['mon']/3));
204 break;
205 case'g':
206 $out.=($date['hours']>12)?$date['hours']-12:$date['hours'];
207 break;
208 case'G':
209 $out.=$date['hours'];
210 break;
211 case'h':
212 $hour=($date['hours']>12)?$date['hours']-12:$date['hours'];
213 $out.=($hour<10)?"0$hour":$hour;
214 break;
215 case'H':
216 $out.=($date['hours']<10)?'0'.$date['hours']:$date['hours'];
217 break;
218 case'i':
219 $out.=($date['minutes']<10)?'0'.$date['minutes']:$date['minutes'];
220 break;
221 case's':
222 $out.=($date['seconds']<10)?'0'.$date['seconds']:$date['seconds'];
223 break;
224 //full date time
225 case'c':
226 $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
227 break;
228 case'r':
229 $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
230 break;
231 case'U':
232 $out=$timestamp;
233 break;
234 //others
235 case'e':case'I':case'i':case'O':case'P':case'T':case'Z':case'u':break;
236 default:$out.=$format[$i];
237 }
238 }
239 if($lang=='per')
240 return self::trim_number($out);
241 else
242 return $out;
243 }
244
245 public function gregurian_date($format,$persiandate)
246 {
247 preg_match_all('!\d+!', $persiandate, $matches);
248 $matches=$matches[0];
249 list($year,$mon,$day)=self::persian_to_gregorian($matches[0],$matches[1],$matches[2]);
250 return date($format,mktime($matches[3],$matches[4],$matches[5],$mon,$day,$year,-1));
251 }
252 }
253
254
255 /*
256 * parsidate function
257 */
258 function parsidate($input,$datetime='now',$lang='per')
259 {
260 $bndate =bn_parsidate::getInstance();
261 $bndate = $bndate->persian_date($input,$datetime,$lang);
262 return $bndate;
263 }
264
265 function gregdate($input,$datetime)
266 {
267 $bndate =bn_parsidate::getInstance();
268 $bndate = $bndate->gregurian_date($input,$datetime);
269 return $bndate;
270 }
271 ?>