Created
July 18, 2021 13:11
-
-
Save siaeb/54aed52e198048d66d30bfba7aff3adb to your computer and use it in GitHub Desktop.
توابع کتابخانه JDF به صورت کلاس
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class JDF { | |
/* In the name of Allah = بسم اللّه الرّحمن الرّحیم */ | |
/** | |
* @فارسی : توابع زمان و تاریخ هجری شمسی (جلالی) در پی اچ پی | |
* @name: Hijri_Shamsi,Solar(Jalali) Date and Time Functions | |
* @Author : Reza Gholampanahi & WebSite : http://jdf.scr.ir | |
* @License: GNU/LGPL _ Open Source & Free : [all public functions] | |
* @Version: 2.70 =>[ 1395/11/22 = 1438/05/12 = 2017/02/10 ] | |
*/ | |
/* F */ | |
public function jdate( $format, $timestamp = '', $none = '', $time_zone = 'Asia/Tehran', $tr_num = 'fa' ) { | |
$T_sec = 0;/* <= رفع خطاي زمان سرور ، با اعداد '+' و '-' بر حسب ثانيه */ | |
if ( $time_zone != 'local' ) { | |
date_default_timezone_set( ( $time_zone === '' ) ? 'Asia/Tehran' : $time_zone ); | |
} | |
$ts = $T_sec + ( ( $timestamp === '' ) ? time() : $this->tr_num( $timestamp ) ); | |
$date = explode( '_', date( 'H_i_j_n_O_P_s_w_Y', $ts ) ); | |
list( $j_y, $j_m, $j_d ) = $this->gregorian_to_jalali( $date[8], $date[3], $date[2] ); | |
$doy = ( $j_m < 7 ) ? ( ( $j_m - 1 ) * 31 ) + $j_d - 1 : ( ( $j_m - 7 ) * 30 ) + $j_d + 185; | |
$kab = ( ( ( ( $j_y % 33 ) % 4 ) - 1 ) == ( (int) ( ( $j_y % 33 ) * 0.05 ) ) ) ? 1 : 0; | |
$sl = strlen( $format ); | |
$out = ''; | |
for ( $i = 0; $i < $sl; $i ++ ) { | |
$sub = substr( $format, $i, 1 ); | |
if ( $sub == '\\' ) { | |
$out .= substr( $format, ++ $i, 1 ); | |
continue; | |
} | |
switch ( $sub ) { | |
case'E': | |
case'R': | |
case'x': | |
case'X': | |
$out .= 'http://jdf.scr.ir'; | |
break; | |
case'B': | |
case'e': | |
case'g': | |
case'G': | |
case'h': | |
case'I': | |
case'T': | |
case'u': | |
case'Z': | |
$out .= date( $sub, $ts ); | |
break; | |
case'a': | |
$out .= ( $date[0] < 12 ) ? 'ق.ظ' : 'ب.ظ'; | |
break; | |
case'A': | |
$out .= ( $date[0] < 12 ) ? 'قبل از ظهر' : 'بعد از ظهر'; | |
break; | |
case'b': | |
$out .= (int) ( $j_m / 3.1 ) + 1; | |
break; | |
case'c': | |
$out .= $j_y . '/' . $j_m . '/' . $j_d . ' ،' . $date[0] . ':' . $date[1] . ':' . $date[6] . ' ' . $date[5]; | |
break; | |
case'C': | |
$out .= (int) ( ( $j_y + 99 ) / 100 ); | |
break; | |
case'd': | |
$out .= ( $j_d < 10 ) ? '0' . $j_d : $j_d; | |
break; | |
case'D': | |
$out .= $this->jdate_words( array( 'kh' => $date[7] ), ' ' ); | |
break; | |
case'f': | |
$out .= $this->jdate_words( array( 'ff' => $j_m ), ' ' ); | |
break; | |
case'F': | |
$out .= $this->jdate_words( array( 'mm' => $j_m ), ' ' ); | |
break; | |
case'H': | |
$out .= $date[0]; | |
break; | |
case'i': | |
$out .= $date[1]; | |
break; | |
case'j': | |
$out .= $j_d; | |
break; | |
case'J': | |
$out .= $this->jdate_words( array( 'rr' => $j_d ), ' ' ); | |
break; | |
case'k'; | |
$out .= $this->tr_num( 100 - (int) ( $doy / ( $kab + 365 ) * 1000 ) / 10, $tr_num ); | |
break; | |
case'K': | |
$out .= $this->tr_num( (int) ( $doy / ( $kab + 365 ) * 1000 ) / 10, $tr_num ); | |
break; | |
case'l': | |
$out .= $this->jdate_words( array( 'rh' => $date[7] ), ' ' ); | |
break; | |
case'L': | |
$out .= $kab; | |
break; | |
case'm': | |
$out .= ( $j_m > 9 ) ? $j_m : '0' . $j_m; | |
break; | |
case'M': | |
$out .= $this->jdate_words( array( 'km' => $j_m ), ' ' ); | |
break; | |
case'n': | |
$out .= $j_m; | |
break; | |
case'N': | |
$out .= $date[7] + 1; | |
break; | |
case'o': | |
$jdw = ( $date[7] == 6 ) ? 0 : $date[7] + 1; | |
$dny = 364 + $kab - $doy; | |
$out .= ( $jdw > ( $doy + 3 ) and $doy < 3 ) ? $j_y - 1 : ( ( ( 3 - $dny ) > $jdw and $dny < 3 ) ? $j_y + 1 : $j_y ); | |
break; | |
case'O': | |
$out .= $date[4]; | |
break; | |
case'p': | |
$out .= $this->jdate_words( array( 'mb' => $j_m ), ' ' ); | |
break; | |
case'P': | |
$out .= $date[5]; | |
break; | |
case'q': | |
$out .= $this->jdate_words( array( 'sh' => $j_y ), ' ' ); | |
break; | |
case'Q': | |
$out .= $kab + 364 - $doy; | |
break; | |
case'r': | |
$key = $this->jdate_words( array( 'rh' => $date[7], 'mm' => $j_m ) ); | |
$out .= $date[0] . ':' . $date[1] . ':' . $date[6] . ' ' . $date[4] . ' ' . $key['rh'] . '، ' . $j_d . ' ' . $key['mm'] . ' ' . $j_y; | |
break; | |
case's': | |
$out .= $date[6]; | |
break; | |
case'S': | |
$out .= 'ام'; | |
break; | |
case't': | |
$out .= ( $j_m != 12 ) ? ( 31 - (int) ( $j_m / 6.5 ) ) : ( $kab + 29 ); | |
break; | |
case'U': | |
$out .= $ts; | |
break; | |
case'v': | |
$out .= $this->jdate_words( array( 'ss' => ( $j_y % 100 ) ), ' ' ); | |
break; | |
case'V': | |
$out .= $this->jdate_words( array( 'ss' => $j_y ), ' ' ); | |
break; | |
case'w': | |
$out .= ( $date[7] == 6 ) ? 0 : $date[7] + 1; | |
break; | |
case'W': | |
$avs = ( ( $date[7] == 6 ) ? 0 : $date[7] + 1 ) - ( $doy % 7 ); | |
if ( $avs < 0 ) { | |
$avs += 7; | |
} | |
$num = (int) ( ( $doy + $avs ) / 7 ); | |
if ( $avs < 4 ) { | |
$num ++; | |
} elseif ( $num < 1 ) { | |
$num = ( $avs == 4 or $avs == ( ( ( ( ( $j_y % 33 ) % 4 ) - 2 ) == ( (int) ( ( $j_y % 33 ) * 0.05 ) ) ) ? 5 : 4 ) ) ? 53 : 52; | |
} | |
$aks = $avs + $kab; | |
if ( $aks == 7 ) { | |
$aks = 0; | |
} | |
$out .= ( ( $kab + 363 - $doy ) < $aks and $aks < 3 ) ? '01' : ( ( $num < 10 ) ? '0' . $num : $num ); | |
break; | |
case'y': | |
$out .= substr( $j_y, 2, 2 ); | |
break; | |
case'Y': | |
$out .= $j_y; | |
break; | |
case'z': | |
$out .= $doy; | |
break; | |
default: | |
$out .= $sub; | |
} | |
} | |
return ( $tr_num != 'en' ) ? $this->tr_num( $out, 'fa', '.' ) : $out; | |
} | |
/* F */ | |
public function jstrftime( $format, $timestamp = '', $none = '', $time_zone = 'Asia/Tehran', $tr_num = 'fa' ) { | |
$T_sec = 0;/* <= رفع خطاي زمان سرور ، با اعداد '+' و '-' بر حسب ثانيه */ | |
if ( $time_zone != 'local' ) { | |
date_default_timezone_set( ( $time_zone === '' ) ? 'Asia/Tehran' : $time_zone ); | |
} | |
$ts = $T_sec + ( ( $timestamp === '' ) ? time() : $this->tr_num( $timestamp ) ); | |
$date = explode( '_', date( 'h_H_i_j_n_s_w_Y', $ts ) ); | |
list( $j_y, $j_m, $j_d ) = $this->gregorian_to_jalali( $date[7], $date[4], $date[3] ); | |
$doy = ( $j_m < 7 ) ? ( ( $j_m - 1 ) * 31 ) + $j_d - 1 : ( ( $j_m - 7 ) * 30 ) + $j_d + 185; | |
$kab = ( ( ( ( $j_y % 33 ) % 4 ) - 1 ) == ( (int) ( ( $j_y % 33 ) * 0.05 ) ) ) ? 1 : 0; | |
$sl = strlen( $format ); | |
$out = ''; | |
for ( $i = 0; $i < $sl; $i ++ ) { | |
$sub = substr( $format, $i, 1 ); | |
if ( $sub == '%' ) { | |
$sub = substr( $format, ++ $i, 1 ); | |
} else { | |
$out .= $sub; | |
continue; | |
} | |
switch ( $sub ) { | |
/* Day */ case'a': | |
$out .= $this->jdate_words( array( 'kh' => $date[6] ), ' ' ); | |
break; | |
case'A': | |
$out .= $this->jdate_words( array( 'rh' => $date[6] ), ' ' ); | |
break; | |
case'd': | |
$out .= ( $j_d < 10 ) ? '0' . $j_d : $j_d; | |
break; | |
case'e': | |
$out .= ( $j_d < 10 ) ? ' ' . $j_d : $j_d; | |
break; | |
case'j': | |
$out .= str_pad( $doy + 1, 3, 0, STR_PAD_LEFT ); | |
break; | |
case'u': | |
$out .= $date[6] + 1; | |
break; | |
case'w': | |
$out .= ( $date[6] == 6 ) ? 0 : $date[6] + 1; | |
break; | |
/* Week */ case'U': | |
$avs = ( ( $date[6] < 5 ) ? $date[6] + 2 : $date[6] - 5 ) - ( $doy % 7 ); | |
if ( $avs < 0 ) { | |
$avs += 7; | |
} | |
$num = (int) ( ( $doy + $avs ) / 7 ) + 1; | |
if ( $avs > 3 or $avs == 1 ) { | |
$num --; | |
} | |
$out .= ( $num < 10 ) ? '0' . $num : $num; | |
break; | |
case'V': | |
$avs = ( ( $date[6] == 6 ) ? 0 : $date[6] + 1 ) - ( $doy % 7 ); | |
if ( $avs < 0 ) { | |
$avs += 7; | |
} | |
$num = (int) ( ( $doy + $avs ) / 7 ); | |
if ( $avs < 4 ) { | |
$num ++; | |
} elseif ( $num < 1 ) { | |
$num = ( $avs == 4 or $avs == ( ( ( ( ( $j_y % 33 ) % 4 ) - 2 ) == ( (int) ( ( $j_y % 33 ) * 0.05 ) ) ) ? 5 : 4 ) ) ? 53 : 52; | |
} | |
$aks = $avs + $kab; | |
if ( $aks == 7 ) { | |
$aks = 0; | |
} | |
$out .= ( ( $kab + 363 - $doy ) < $aks and $aks < 3 ) ? '01' : ( ( $num < 10 ) ? '0' . $num : $num ); | |
break; | |
case'W': | |
$avs = ( ( $date[6] == 6 ) ? 0 : $date[6] + 1 ) - ( $doy % 7 ); | |
if ( $avs < 0 ) { | |
$avs += 7; | |
} | |
$num = (int) ( ( $doy + $avs ) / 7 ) + 1; | |
if ( $avs > 3 ) { | |
$num --; | |
} | |
$out .= ( $num < 10 ) ? '0' . $num : $num; | |
break; | |
/* Month */ case'b': | |
case'h': | |
$out .= $this->jdate_words( array( 'km' => $j_m ), ' ' ); | |
break; | |
case'B': | |
$out .= $this->jdate_words( array( 'mm' => $j_m ), ' ' ); | |
break; | |
case'm': | |
$out .= ( $j_m > 9 ) ? $j_m : '0' . $j_m; | |
break; | |
/* Year */ case'C': | |
$tmp = (int) ( $j_y / 100 ); | |
$out .= ( $tmp > 9 ) ? $tmp : '0' . $tmp; | |
break; | |
case'g': | |
$jdw = ( $date[6] == 6 ) ? 0 : $date[6] + 1; | |
$dny = 364 + $kab - $doy; | |
$out .= substr( ( $jdw > ( $doy + 3 ) and $doy < 3 ) ? $j_y - 1 : ( ( ( 3 - $dny ) > $jdw and $dny < 3 ) ? $j_y + 1 : $j_y ), 2, 2 ); | |
break; | |
case'G': | |
$jdw = ( $date[6] == 6 ) ? 0 : $date[6] + 1; | |
$dny = 364 + $kab - $doy; | |
$out .= ( $jdw > ( $doy + 3 ) and $doy < 3 ) ? $j_y - 1 : ( ( ( 3 - $dny ) > $jdw and $dny < 3 ) ? $j_y + 1 : $j_y ); | |
break; | |
case'y': | |
$out .= substr( $j_y, 2, 2 ); | |
break; | |
case'Y': | |
$out .= $j_y; | |
break; | |
/* Time */ case'H': | |
$out .= $date[1]; | |
break; | |
case'I': | |
$out .= $date[0]; | |
break; | |
case'l': | |
$out .= ( $date[0] > 9 ) ? $date[0] : ' ' . (int) $date[0]; | |
break; | |
case'M': | |
$out .= $date[2]; | |
break; | |
case'p': | |
$out .= ( $date[1] < 12 ) ? 'قبل از ظهر' : 'بعد از ظهر'; | |
break; | |
case'P': | |
$out .= ( $date[1] < 12 ) ? 'ق.ظ' : 'ب.ظ'; | |
break; | |
case'r': | |
$out .= $date[0] . ':' . $date[2] . ':' . $date[5] . ' ' . ( ( $date[1] < 12 ) ? 'قبل از ظهر' : 'بعد از ظهر' ); | |
break; | |
case'R': | |
$out .= $date[1] . ':' . $date[2]; | |
break; | |
case'S': | |
$out .= $date[5]; | |
break; | |
case'T': | |
$out .= $date[1] . ':' . $date[2] . ':' . $date[5]; | |
break; | |
case'X': | |
$out .= $date[0] . ':' . $date[2] . ':' . $date[5]; | |
break; | |
case'z': | |
$out .= date( 'O', $ts ); | |
break; | |
case'Z': | |
$out .= date( 'T', $ts ); | |
break; | |
/* Time and Date Stamps */ case'c': | |
$key = $this->jdate_words( array( 'rh' => $date[6], 'mm' => $j_m ) ); | |
$out .= $date[1] . ':' . $date[2] . ':' . $date[5] . ' ' . date( 'P', $ts ) . ' ' . $key['rh'] . '، ' . $j_d . ' ' . $key['mm'] . ' ' . $j_y; | |
break; | |
case'D': | |
$out .= substr( $j_y, 2, 2 ) . '/' . ( ( $j_m > 9 ) ? $j_m : '0' . $j_m ) . '/' . ( ( $j_d < 10 ) ? '0' . $j_d : $j_d ); | |
break; | |
case'F': | |
$out .= $j_y . '-' . ( ( $j_m > 9 ) ? $j_m : '0' . $j_m ) . '-' . ( ( $j_d < 10 ) ? '0' . $j_d : $j_d ); | |
break; | |
case's': | |
$out .= $ts; | |
break; | |
case'x': | |
$out .= substr( $j_y, 2, 2 ) . '/' . ( ( $j_m > 9 ) ? $j_m : '0' . $j_m ) . '/' . ( ( $j_d < 10 ) ? '0' . $j_d : $j_d ); | |
break; | |
/* Miscellaneous */ case'n': | |
$out .= "\n"; | |
break; | |
case't': | |
$out .= "\t"; | |
break; | |
case'%': | |
$out .= '%'; | |
break; | |
default: | |
$out .= $sub; | |
} | |
} | |
return ( $tr_num != 'en' ) ? $this->tr_num( $out, 'fa', '.' ) : $out; | |
} | |
/* F */ | |
public function jmktime( $h = '', $m = '', $s = '', $jm = '', $jd = '', $jy = '', $none = '', $timezone = 'Asia/Tehran' ) { | |
if ( $timezone != 'local' ) { | |
date_default_timezone_set( $timezone ); | |
} | |
if ( $h === '' ) { | |
return time(); | |
} else { | |
list( $h, $m, $s, $jm, $jd, $jy ) = explode( '_', $this->tr_num( $h . '_' . $m . '_' . $s . '_' . $jm . '_' . $jd . '_' . $jy ) ); | |
if ( $m === '' ) { | |
return mktime( $h ); | |
} else { | |
if ( $s === '' ) { | |
return mktime( $h, $m ); | |
} else { | |
if ( $jm === '' ) { | |
return mktime( $h, $m, $s ); | |
} else { | |
$jdate = explode( '_', $this->jdate( 'Y_j', '', '', $timezone, 'en' ) ); | |
if ( $jd === '' ) { | |
list( $gy, $gm, $gd ) = $this->jalali_to_gregorian( $jdate[0], $jm, $jdate[1] ); | |
return mktime( $h, $m, $s, $gm ); | |
} else { | |
if ( $jy === '' ) { | |
list( $gy, $gm, $gd ) = $this->jalali_to_gregorian( $jdate[0], $jm, $jd ); | |
return mktime( $h, $m, $s, $gm, $gd ); | |
} else { | |
list( $gy, $gm, $gd ) = $this->$this->jalali_to_gregorian( $jy, $jm, $jd ); | |
return mktime( $h, $m, $s, $gm, $gd, $gy ); | |
} | |
} | |
} | |
} | |
} | |
} | |
} | |
/* F */ | |
public function jgetdate( $timestamp = '', $none = '', $timezone = 'Asia/Tehran', $tn = 'en' ) { | |
$ts = ( $timestamp === '' ) ? time() : $this->tr_num( $timestamp ); | |
$jdate = explode( '_', $this->jdate( 'F_G_i_j_l_n_s_w_Y_z', $ts, '', $timezone, $tn ) ); | |
return array( | |
'seconds' => $this->tr_num( (int) $this->tr_num( $jdate[6] ), $tn ), | |
'minutes' => $this->tr_num( (int) $this->tr_num( $jdate[2] ), $tn ), | |
'hours' => $jdate[1], | |
'mday' => $jdate[3], | |
'wday' => $jdate[7], | |
'mon' => $jdate[5], | |
'year' => $jdate[8], | |
'yday' => $jdate[9], | |
'weekday' => $jdate[4], | |
'month' => $jdate[0], | |
0 => $this->tr_num( $ts, $tn ) | |
); | |
} | |
/* F */ | |
public function jcheckdate( $jm, $jd, $jy ) { | |
list( $jm, $jd, $jy ) = explode( '_', $this->tr_num( $jm . '_' . $jd . '_' . $jy ) ); | |
$l_d = ( $jm == 12 ) ? ( ( ( ( ( $jy % 33 ) % 4 ) - 1 ) == ( (int) ( ( $jy % 33 ) * 0.05 ) ) ) ? 30 : 29 ) : 31 - (int) ( $jm / 6.5 ); | |
return ( $jm > 12 or $jd > $l_d or $jm < 1 or $jd < 1 or $jy < 1 ) ? false : true; | |
} | |
/* F */ | |
public function tr_num( $str, $mod = 'en', $mf = '٫' ) { | |
$num_a = array( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.' ); | |
$key_a = array( '۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹', $mf ); | |
return ( $mod == 'fa' ) ? str_replace( $num_a, $key_a, $str ) : str_replace( $key_a, $num_a, $str ); | |
} | |
/* F */ | |
public function jdate_words( $array, $mod = '' ) { | |
foreach ( $array as $type => $num ) { | |
$num = (int) $this->tr_num( $num ); | |
switch ( $type ) { | |
case'ss': | |
$sl = strlen( $num ); | |
$xy3 = substr( $num, 2 - $sl, 1 ); | |
$h3 = $h34 = $h4 = ''; | |
if ( $xy3 == 1 ) { | |
$p34 = ''; | |
$k34 = array( | |
'ده', | |
'یازده', | |
'دوازده', | |
'سیزده', | |
'چهارده', | |
'پانزده', | |
'شانزده', | |
'هفده', | |
'هجده', | |
'نوزده' | |
); | |
$h34 = $k34[ substr( $num, 2 - $sl, 2 ) - 10 ]; | |
} else { | |
$xy4 = substr( $num, 3 - $sl, 1 ); | |
$p34 = ( $xy3 == 0 or $xy4 == 0 ) ? '' : ' و '; | |
$k3 = array( '', '', 'بیست', 'سی', 'چهل', 'پنجاه', 'شصت', 'هفتاد', 'هشتاد', 'نود' ); | |
$h3 = $k3[ $xy3 ]; | |
$k4 = array( '', 'یک', 'دو', 'سه', 'چهار', 'پنج', 'شش', 'هفت', 'هشت', 'نه' ); | |
$h4 = $k4[ $xy4 ]; | |
} | |
$array[ $type ] = ( ( $num > 99 ) ? str_replace( array( | |
'12', | |
'13', | |
'14', | |
'19', | |
'20' | |
), array( | |
'هزار و دویست', | |
'هزار و سیصد', | |
'هزار و چهارصد', | |
'هزار و نهصد', | |
'دوهزار' | |
), substr( $num, 0, 2 ) ) . ( ( substr( $num, 2, 2 ) == '00' ) ? '' : ' و ' ) : '' ) . $h3 . $p34 . $h34 . $h4; | |
break; | |
case'mm': | |
$key = array( | |
'فروردین', | |
'اردیبهشت', | |
'خرداد', | |
'تیر', | |
'مرداد', | |
'شهریور', | |
'مهر', | |
'آبان', | |
'آذر', | |
'دی', | |
'بهمن', | |
'اسفند' | |
); | |
$array[ $type ] = $key[ $num - 1 ]; | |
break; | |
case'rr': | |
$key = array( | |
'یک', | |
'دو', | |
'سه', | |
'چهار', | |
'پنج', | |
'شش', | |
'هفت', | |
'هشت', | |
'نه', | |
'ده', | |
'یازده', | |
'دوازده', | |
'سیزده', | |
'چهارده', | |
'پانزده', | |
'شانزده', | |
'هفده', | |
'هجده', | |
'نوزده', | |
'بیست', | |
'بیست و یک', | |
'بیست و دو', | |
'بیست و سه', | |
'بیست و چهار', | |
'بیست و پنج', | |
'بیست و شش', | |
'بیست و هفت', | |
'بیست و هشت', | |
'بیست و نه', | |
'سی', | |
'سی و یک' | |
); | |
$array[ $type ] = $key[ $num - 1 ]; | |
break; | |
case'rh': | |
$key = array( 'یکشنبه', 'دوشنبه', 'سه شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه' ); | |
$array[ $type ] = $key[ $num ]; | |
break; | |
case'sh': | |
$key = array( | |
'مار', | |
'اسب', | |
'گوسفند', | |
'میمون', | |
'مرغ', | |
'سگ', | |
'خوک', | |
'موش', | |
'گاو', | |
'پلنگ', | |
'خرگوش', | |
'نهنگ' | |
); | |
$array[ $type ] = $key[ $num % 12 ]; | |
break; | |
case'mb': | |
$key = array( | |
'حمل', | |
'ثور', | |
'جوزا', | |
'سرطان', | |
'اسد', | |
'سنبله', | |
'میزان', | |
'عقرب', | |
'قوس', | |
'جدی', | |
'دلو', | |
'حوت' | |
); | |
$array[ $type ] = $key[ $num - 1 ]; | |
break; | |
case'ff': | |
$key = array( 'بهار', 'تابستان', 'پاییز', 'زمستان' ); | |
$array[ $type ] = $key[ (int) ( $num / 3.1 ) ]; | |
break; | |
case'km': | |
$key = array( | |
'فر', | |
'ار', | |
'خر', | |
'تی', | |
'مر', | |
'شه', | |
'مه', | |
'آب', | |
'آذ', | |
'دی', | |
'به', | |
'اس' | |
); | |
$array[ $type ] = $key[ $num - 1 ]; | |
break; | |
case'kh': | |
$key = array( 'ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش' ); | |
$array[ $type ] = $key[ $num ]; | |
break; | |
default: | |
$array[ $type ] = $num; | |
} | |
} | |
return ( $mod === '' ) ? $array : implode( $mod, $array ); | |
} | |
/** Gregorian & Jalali (Hijri_Shamsi,Solar) date converter Functions | |
* Author: JDF.SCR.IR =>> Download Full Version : http://jdf.scr.ir/jdf | |
* License: GNU/LGPL _ Open Source & Free _ Version: 2.70 : [2017=1395] | |
* -------------------------------------------------------------------- | |
* 1461 = 365*4 + 4/4 & 146097 = 365*400 + 400/4 - 400/100 + 400/400 | |
* 12053 = 365*33 + 32/4 & 36524 = 365*100 + 100/4 - 100/100 */ | |
/* F */ | |
public function gregorian_to_jalali( $gy, $gm, $gd, $mod = '' ) { | |
list( $gy, $gm, $gd ) = explode( '_', $this->tr_num( $gy . '_' . $gm . '_' . $gd ) );/* <= Extra :اين سطر ، جزء تابع اصلي نيست */ | |
$g_d_m = array( 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ); | |
if ( $gy > 1600 ) { | |
$jy = 979; | |
$gy -= 1600; | |
} else { | |
$jy = 0; | |
$gy -= 621; | |
} | |
$gy2 = ( $gm > 2 ) ? ( $gy + 1 ) : $gy; | |
$days = ( 365 * $gy ) + ( (int) ( ( $gy2 + 3 ) / 4 ) ) - ( (int) ( ( $gy2 + 99 ) / 100 ) ) + ( (int) ( ( $gy2 + 399 ) / 400 ) ) - 80 + $gd + $g_d_m[ $gm - 1 ]; | |
$jy += 33 * ( (int) ( $days / 12053 ) ); | |
$days %= 12053; | |
$jy += 4 * ( (int) ( $days / 1461 ) ); | |
$days %= 1461; | |
$jy += (int) ( ( $days - 1 ) / 365 ); | |
if ( $days > 365 ) { | |
$days = ( $days - 1 ) % 365; | |
} | |
if ( $days < 186 ) { | |
$jm = 1 + (int) ( $days / 31 ); | |
$jd = 1 + ( $days % 31 ); | |
} else { | |
$jm = 7 + (int) ( ( $days - 186 ) / 30 ); | |
$jd = 1 + ( ( $days - 186 ) % 30 ); | |
} | |
return ( $mod === '' ) ? array( $jy, $jm, $jd ) : $jy . $mod . $jm . $mod . $jd; | |
} | |
/* F */ | |
public function jalali_to_gregorian( $jy, $jm, $jd, $mod = '' ) { | |
list( $jy, $jm, $jd ) = explode( '_', $this->tr_num( $jy . '_' . $jm . '_' . $jd ) );/* <= Extra :اين سطر ، جزء تابع اصلي نيست */ | |
if ( $jy > 979 ) { | |
$gy = 1600; | |
$jy -= 979; | |
} else { | |
$gy = 621; | |
} | |
$days = ( 365 * $jy ) + ( ( (int) ( $jy / 33 ) ) * 8 ) + ( (int) ( ( ( $jy % 33 ) + 3 ) / 4 ) ) + 78 + $jd + ( ( $jm < 7 ) ? ( $jm - 1 ) * 31 : ( ( $jm - 7 ) * 30 ) + 186 ); | |
$gy += 400 * ( (int) ( $days / 146097 ) ); | |
$days %= 146097; | |
if ( $days > 36524 ) { | |
$gy += 100 * ( (int) ( -- $days / 36524 ) ); | |
$days %= 36524; | |
if ( $days >= 365 ) { | |
$days ++; | |
} | |
} | |
$gy += 4 * ( (int) ( ( $days ) / 1461 ) ); | |
$days %= 1461; | |
$gy += (int) ( ( $days - 1 ) / 365 ); | |
if ( $days > 365 ) { | |
$days = ( $days - 1 ) % 365; | |
} | |
$gd = $days + 1; | |
foreach ( | |
array( | |
0, | |
31, | |
( ( ( $gy % 4 == 0 ) and ( $gy % 100 != 0 ) ) or ( $gy % 400 == 0 ) ) ? 29 : 28, | |
31, | |
30, | |
31, | |
30, | |
31, | |
31, | |
30, | |
31, | |
30, | |
31 | |
) as $gm => $v | |
) { | |
if ( $gd <= $v ) { | |
break; | |
} | |
$gd -= $v; | |
} | |
return ( $mod === '' ) ? array( $gy, $gm, $gd ) : $gy . $mod . $gm . $mod . $gd; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment