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 | ?> |