PDA

View Full Version : تبدیل تاریخ میلادی به شمسی



امید امرایی
سه شنبه 21 اسفند 1386, 14:12 عصر
این تابع سه پارامتر دارد :
1- پارامتر اول در صورتی که true باشد روز به صورت حروفی نمایش داده خواهد شد .
2- پارامتر دوم به صورت پیش فرض برابر با Alpha و نشان دهنده این است که ماه به صورت حروفی نمایش داده شود و غیر از این مقدار به صورت عددی نمایش داده خواهد شد .
3- پارامتر سوم در صورتی که وجود داشته باشد می تواند یک تاریخ میلادی با فرمت yy-mm-dd باشد تا در خروجی به شمسی تبدیل گردد . (تاریخ جاری نمایش داده نخواهد شد!)



function showDate($W=true,$M='alpha',$ufDate="none")
{
$week = array('یکشنبه','دوشنبه','سه شنبه','چهارشنبه','پنج شنبه','جمعه','شنبه');
if($M == 'alpha') $months = array('فروردین','اردیبهشت','خرد د','تیر','مرداد','شهریور','مهر' ,'آبان','آذر','دی','بهمن','اسفند ');
else $months = array("1","2","3","4","5","6","7","8","9","10","11","12");

if($ufDate != "none"){
$ufd = explode("-",$ufDate);
$d = '';
$day= $ufd[0];
$month = $ufd[1];
$year= $ufd[2];
}else{
$year = date('y');
$month = date('m');
$d = date('w');
$day = date('d');
}

$year = ($year== 0)?2000:$year;
($year<1000)? ($year += 2000):true;

$year -= ( ($month < 3) || (($month == 3) && ($day < 21)) )? 622:621;

switch ($month)
{
case 1: if($day<21){$month=10;$day+=10;}else{$month=11;$day-=20;} break;
case 2: if($day<20){$month=11;$day+=11;}else{$month=12;$day-=19;} break;
case 3: if($day<21){$month=12;$day+=9;}else{$month=1;$day-=20;} break;
case 4: if($day<21){$month=1;$day+=11;}else{$month=2;$day-=20;} break;
case 5:
case 6: if($day<22){$month-=3;$day+=10;}else{$month-=2;$day-=21;} break;
case 7:
case 8:
case 9: if($day<23){$month-=3;$day+=9;}else{$month-=2;$day-=22;} break;
case 10:if($day<23){$month=7;$day+=8;}else{$month=8;$day-=22;} break;
case 11:
case 12:if($day<22){$month-=3;$day+=9;}else{$month-=2;$day-=21;} break;
default:
break;
}

if($W == true)
return $week[$d].' '.$day.' '.$months[$month-1].' '.$year;
else if($w != true){
if($M == 'alpha') return '<p dir="rl">'.$day.' '.$months[$month-1].' '.$year.'</p>';
else return $year.'-'.$month.'-'.$day;
}
}


استفاده از این تابع بدون پارامتر تاریخ جاری را به صورت "مثال : پنجشنبه 1 فروردین 1387" نشان خواهد داد .

oxygenws
سه شنبه 21 اسفند 1386, 14:34 عصر
این تقویم اشتباه است، حداقل برای سه ماه توی سال های کبیسه و اون سالی که سی و خورده ای سال اضافه میشه خراب کار می‌کنه.
انجمن رو جستجو کن، قبلا کدهای درستی در انجمن بازمتن منتشر شده.

majoran
سه شنبه 21 اسفند 1386, 15:08 عصر
آقا اگه ممکنه تاریخ قمری رو هم برای ما قرار بدین متشکر میشم

امید امرایی
سه شنبه 21 اسفند 1386, 18:18 عصر
این تقویم اشتباه است، حداقل برای سه ماه توی سال های کبیسه و اون سالی که سی و خورده ای سال اضافه میشه خراب کار می‌کنه.
انجمن رو جستجو کن، قبلا کدهای درستی در انجمن بازمتن منتشر شده.


این تقویم رو بنده 3 ساله که دارم استفاده و تست می کنم و در هیچ موردی با اشکال رو به رو نبوده . اگه لطف کنید لینک مطلبی رو که می گین بدین ممنون می شم .

oxygenws
سه شنبه 21 اسفند 1386, 19:58 عصر
این تقویم رو بنده 3 ساله که دارم استفاده و تست می کنم و در هیچ موردی با اشکال رو به رو نبوده . اگه لطف کنید لینک مطلبی رو که می گین بدین ممنون می شم .
احتمالا می‌دونی که هر ۴ سال کبیسه می‌شه و احتمالا می‌دونی که سال دیگه کبیسه است؟! پس منتظر یک انقلاب باش :)
http://barnamenevis.org/forum/showthread.php?t=69042

امید امرایی
سه شنبه 21 اسفند 1386, 21:58 عصر
قبل از هر چیز از اظهار نظر و کمک شما خیلی ممنونم
اما احتمالا می دونید که 3 سال پیش سال کبیسه بوده و از اون مهم تر اینکه مطمئنا شما تا حالا این کد رو در یک سال کبیسه تست نکردید و صرف اینکه شما هم فقط شنیدین سندیتی نمی تونه داشته باشه .
اما لینکی که دایدن رو من دیدم غیر از یک مورد که به وجود باگ اشاره شده مطلب دیگه ای نبود که مرتبط با موضوع باشه و البته در اون یک مورد هم فقط به وجودش اشاره شده و حالا چی هست الله اعلم .
والبته مطلبی دیدم که ظاهرا این کد متعلق به شخص خاصی معرفی شده بود که این هم صحت نمی تونه داشته باشه چرا که این سورس رو بنده اولین بار حدود 3 سال پیش به زبان جاوا اسکریپت دیدم و خودم به PHP بر گردوندم و تا حالا 3 الی 4 بار هم ویرایش شده و باز هم خواهد شد تا به نتیجه مطلوب برسه