PDA

View Full Version : مشکل در jalali.php



masoud.ace
شنبه 31 فروردین 1392, 09:27 صبح
سلام دوستان

ما یک سایتی داریم که سیستمی داره که از سال جدید قاطی کرده و تاریخ پست ها را در قسمت سالش بجای 92 میزنه 88، اینم فایل jalali.php ، اگه راهنمایی کنین که مشکل چیه یک دنیا ممنون میشم.


<?php
function div($a,$b) {
return (int) ($a / $b);
}

function gregorian_to_jalali ($g_y, $g_m, $g_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);

$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)))
/* leap and after Feb */
$g_day_no++;
$g_day_no += $gd;

$j_day_no = $g_day_no-79;

$j_np = div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */
$j_day_no = $j_day_no % 12053;

$jy = 979+33*$j_np+4*div($j_day_no,1461); /* 1461 = 365*4 + 4/4 */

$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;

return array($jy, $jm, $jd);
}

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); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
$g_day_no = $g_day_no % 146097;

$leap = true;
if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
{
$g_day_no--;
$gy += 100*div($g_day_no, 36524); /* 36524 = 365*100 + 100/4 - 100/100 */
$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); /* 1461 = 365*4 + 4/4 */
$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);
}

function getMahname($mah){
$smah[1]="فروردین";
$smah[2]="اردیبهشت";
$smah[3]="خرداد";
$smah[4]="تیر";
$smah[5]="مرداد";
$smah[6]="شهریور";
$smah[7]="مهر";
$smah[8]="آبان";
$smah[9]="آذر";
$smah[10]="دی";
$smah[11]="بهمن";
$smah[12]="اسفند";
return $smah[$mah];
}

?>

فرزند کوروش
شنبه 31 فروردین 1392, 10:07 صبح
ببین تاریخ و ساعت سیستم خودت که داری سایت رو باهاش میبینی تنظیم هست؟
ادرس سایت رو بده

masoud.ace
شنبه 31 فروردین 1392, 10:16 صبح
ببین تاریخ و ساعت سیستم خودت که داری سایت رو باهاش میبینی تنظیم هست؟
ادرس سایت رو بده
برادر من اینکه شما میگی زمانی هست که کد جاوا اسکریپت باشه و سمت کلاینت، این php هست و با تاریخ سرور کار میکنه

MMSHFE
شنبه 31 فروردین 1392, 10:41 صبح
دوست عزیز، از JDF (http://jdf.scr.ir) استفاده کنید.

masoud.ace
شنبه 31 فروردین 1392, 10:50 صبح
دوست عزیز، از JDF (http://jdf.scr.ir) استفاده کنید.
مهندس سیستمش رو یکی دیگه نوشته من زیاد سر در نمیارم که بخوام تغییرش بدم اگه این فایلی که گذاشتم مشکلی داره بفرمایین

MMSHFE
شنبه 31 فروردین 1392, 10:57 صبح
بجای دو تابع jalali_to_gregorian و gregorian_to_jalali خودتون، این سه تابع رو بگذارین:


function tr_num($str,$mod='en'){
$num_a=array('0','1','2','3','4','5','6','7','8',' 9');
$key_a=array('۰','۱','۲','۳','۴','۵','۶',' ','۸','۹');
return($mod=='fa')?str_ireplace($num_a,$key_a,$str ):str_ireplace($key_a,$num_a,$str);
}

function gregorian_to_jalali($g_y,$g_m,$g_d,$mod=''){
$g_y=tr_num($g_y); $g_m=tr_num($g_m); $g_d=tr_num($g_d);
$g_a=array(0,0,31,59,90,120,151,181,212,243,273,30 4,334);
$doy_g=$g_a[(int)$g_m]+$g_d;
if(($g_y%4)==0 and $g_m>2)$doy_g++;
$jy=($doy_g<80)?$g_y-622:$g_y-621;
$doy_j=($doy_g>79)?$doy_g-80:$doy_g+(($jy%4==3)?286:285);
if($doy_j<186){
$a=0; $b=31; $c=1;
}else{
$a=186; $b=30; $c=7;
}
$jm=(int)(($doy_j-$a)/$b);
$jd=$doy_j-$a-($jm*$b)+1;
$jm+=$c;
return($mod=='')?array($jy,$jm,$jd):$jy.$mod.$jm.$ mod.$jd;
}

function jalali_to_gregorian($j_y,$j_m,$j_d,$mod=''){
$j_y=tr_num($j_y); $j_m=tr_num($j_m); $j_d=tr_num($j_d);
$doy_j=($j_m<7)?((($j_m-1)*31)+$j_d):((($j_m-7)*30)+$j_d)+186;
$d28x=($j_y%4==3)?287:286;
if($doy_j>$d28x){
$gy=$j_y+622;
$gd=$doy_j-$d28x;
}else{
$gy=$j_y+621;
$gd=$doy_j+79;
}
$g_a=array(0,31,(($gy%4==0)?29:28),31,30,31,30,31, 31,30,31,30,31);
foreach($g_a as $gm=>$v){
if($gd<=$v)break;
$gd-=$v;
}
return($mod=='')?array($gy,$gm,$gd):$gy.$mod.$gm.$ mod.$gd;
}

نکته: کلیه حقوق کدهای فوق برای توسعه دهندگان JDF (http://jdf.scr.ir) محفوظه و من فقط کد اونها رو براتون نوشتم.

masoud.ace
شنبه 31 فروردین 1392, 11:06 صبح
بجای دو تابع jalali_to_gregorian و gregorian_to_jalali خودتون، این سه تابع رو بگذارین:


function tr_num($str,$mod='en'){
$num_a=array('0','1','2','3','4','5','6','7','8',' 9');
$key_a=array('۰','۱','۲','۳','۴','۵','۶',' ','۸','۹');
return($mod=='fa')?str_ireplace($num_a,$key_a,$str ):str_ireplace($key_a,$num_a,$str);
}

function gregorian_to_jalali($g_y,$g_m,$g_d,$mod=''){
$g_y=tr_num($g_y); $g_m=tr_num($g_m); $g_d=tr_num($g_d);
$g_a=array(0,0,31,59,90,120,151,181,212,243,273,30 4,334);
$doy_g=$g_a[(int)$g_m]+$g_d;
if(($g_y%4)==0 and $g_m>2)$doy_g++;
$jy=($doy_g<80)?$g_y-622:$g_y-621;
$doy_j=($doy_g>79)?$doy_g-80:$doy_g+(($jy%4==3)?286:285);
if($doy_j<186){
$a=0; $b=31; $c=1;
}else{
$a=186; $b=30; $c=7;
}
$jm=(int)(($doy_j-$a)/$b);
$jd=$doy_j-$a-($jm*$b)+1;
$jm+=$c;
return($mod=='')?array($jy,$jm,$jd):$jy.$mod.$jm.$ mod.$jd;
}

function jalali_to_gregorian($j_y,$j_m,$j_d,$mod=''){
$j_y=tr_num($j_y); $j_m=tr_num($j_m); $j_d=tr_num($j_d);
$doy_j=($j_m<7)?((($j_m-1)*31)+$j_d):((($j_m-7)*30)+$j_d)+186;
$d28x=($j_y%4==3)?287:286;
if($doy_j>$d28x){
$gy=$j_y+622;
$gd=$doy_j-$d28x;
}else{
$gy=$j_y+621;
$gd=$doy_j+79;
}
$g_a=array(0,31,(($gy%4==0)?29:28),31,30,31,30,31, 31,30,31,30,31);
foreach($g_a as $gm=>$v){
if($gd<=$v)break;
$gd-=$v;
}
return($mod=='')?array($gy,$gm,$gd):$gy.$mod.$gm.$ mod.$gd;
}

نکته: کلیه حقوق کدهای فوق برای توسعه دهندگان JDF (http://jdf.scr.ir) محفوظه و من فقط کد اونها رو براتون نوشتم.
یک دنیا تشکر مهندس، من اینو امتحان میکنم نتیجش رو همینجا اعلام میکنم

masoud.ace
شنبه 31 فروردین 1392, 21:51 عصر
درست نشد :ناراحت:

2undercover
یک شنبه 01 اردیبهشت 1392, 05:57 صبح
ساعت سرور درسته؟

masoud.ace
یک شنبه 01 اردیبهشت 1392, 17:32 عصر
بله، البته شاید اصلا مشکل ازین فایل نباشه، نه؟

MMSHFE
یک شنبه 01 اردیبهشت 1392, 19:42 عصر
شاید. باید کدتون رو ببینیم. این کد رو توی یک فایل PHP بگذارین و در کنار فایل jalali.php آپلود و بعد توی مرورگر اجرا کنید ببینید چی بهتون میده:


require_once 'jalali.php';
list($gy, $gm, $gd) = explode('/', date('Y/m/d'));
echo "<p>Gregorian: {$gy}/{$gm}/{$gd}</p>" . PHP_EOL;
list($jy, $jm, $jd) = gregorian_to_jalali($gy, $gm, $gd);
echo "<p>Jalali: {$jy}/{$jm}/{$jd}</p>" . PHP_EOL;

masoud.ace
یک شنبه 01 اردیبهشت 1392, 20:27 عصر
شاید. باید کدتون رو ببینیم. این کد رو توی یک فایل PHP بگذارین و در کنار فایل jalali.php آپلود و بعد توی مرورگر اجرا کنید ببینید چی بهتون میده:


require_once 'jalali.php';
list($gy, $gm, $gd) = explode('/', date('Y/m/d'));
echo "<p>Gregorian: {$gy}/{$gm}/{$gd}</p>" . PHP_EOL;
list($jy, $jm, $jd) = gregorian_to_jalali($gy, $gm, $gd);
echo "<p>Jalali: {$jy}/{$jm}/{$jd}</p>" . PHP_EOL;

خروجی:

Gregorian: 2013/04/21
Jalali: 1392/2/1

MMSHFE
یک شنبه 01 اردیبهشت 1392, 20:28 عصر
خوب این که درسته! احتمالاً مشکل توی سایر بخشهای کد شماست چون تاریخها رو داره درست نمایش میده و تبدیل هم به درستی انجام میشه.