// The function to get the format and timestamp and returns the Jalali date
function jalali_date($format = "j/n/Y",$timestamp = ''){
// Set the time stamp to now if it is not provided
if($timestamp == '')
$timestamp = time();
// -----------------------------------------------
$g_y = date("Y",$timestamp);
$g_m = date("m",$timestamp);
$g_d = date("d",$timestamp);
$g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
$gy = $g_y - 1600;
$gm = $g_m-1;
$gd = $g_d-1;
$g_day_no = 365*$gy + div($gy+3,4) - div($gy+99,100) + div($gy+399,400);
for($i=0; $i < $gm; ++$i)
$g_day_no += $g_days_in_month[$i];
if($gm>1 && (($gy%4==0 && $gy%100!=0) || ($gy%400==0)))
$g_day_no++;
$g_day_no += $gd;
$j_day_no = $g_day_no-79;
$j_np = div($j_day_no, 12053);
$j_day_no = $j_day_no % 12053;
$jy = 979+33*$j_np+4 * div($j_day_no,1461);
$j_day_no %= 1461;
if($j_day_no >= 366)
{
$jy += div($j_day_no-1, 365);
$j_day_no = ($j_day_no-1)%365;
}
for($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i)
$j_day_no -= $j_days_in_month[$i];
$jm = $i+1;
$jd = $j_day_no+1;
$jd_2digit = ($jd > 9)? $jd:'0'.$jd;
$jm_2digit = ($jm > 9)? $jm:'0'.$jm;
$jy_2digit = substr($jy,2);
$j_month_names = array('فروردین','اردیبهشت','خرداد','تیر','مرداد','شهریور','مهر','آبان','آذر','دی','بهمن','اسفند');
$j_day_names = array('یکشنبه','دوشنبه','سه شنبه','چهارشنبه','پنجشنبه','جمعه','شنبه');
// Replace the date parameters within the format provided
$format_params = array('d','m','y','Y','l','j','F','n');
$param_replaces = array($jd_2digit,$jm_2digit,$jy_2digit,$jy,$j_day_names[date('w',$timestamp)],$jd,$j_month_names[$jm-1],$jm);
$date = str_replace($format_params,$param_replaces,$format);
// ------------------------------------------------------
return $date;
}
// -----------------------------------
// Converts a Jalali date to Gregorian
function jalali_to_gregorian($j_y,$j_m,$j_d){
$g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
$jy = $j_y-979;
$jm = $j_m-1;
$jd = $j_d-1;
$j_day_no = 365*$jy + div($jy, 33)*8 + div($jy%33+3, 4);
for($i=0; $i < $jm; ++$i)
$j_day_no += $j_days_in_month[$i];
$j_day_no += $jd;
$g_day_no = $j_day_no+79;
$gy = 1600 + 400*div($g_day_no, 146097);
$g_day_no = $g_day_no % 146097;
$leap = true;
if ($g_day_no >= 36525){
$g_day_no--;
$gy += 100*div($g_day_no, 36524);
$g_day_no = $g_day_no % 36524;
if ($g_day_no >= 365)
$g_day_no++;
else
$leap = false;
}
$gy += 4*div($g_day_no, 1461);
$g_day_no %= 1461;
if ($g_day_no >= 366){
$leap = false;
$g_day_no--;
$gy += div($g_day_no, 365);
$g_day_no = $g_day_no % 365;
}
for($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
$g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
$gm = $i+1;
$gd = $g_day_no+1;
return array($gy,$gm,$gd);
}
// ------------------------------------------------------------------------