Skip to content

Instantly share code, notes, and snippets.

@siaeb
Created July 18, 2021 13:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save siaeb/54aed52e198048d66d30bfba7aff3adb to your computer and use it in GitHub Desktop.
Save siaeb/54aed52e198048d66d30bfba7aff3adb to your computer and use it in GitHub Desktop.
توابع کتابخانه JDF به صورت کلاس
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