View Full Version : سوال: تبدیل تاریخ میلادی به شمسی
mporki
سه شنبه 30 آبان 1391, 22:40 عصر
سلام دوستان من تازه شروع کردم به کار،یه اسکریپت دانلود کردم که تاریخ هاش در پایگاه داده به صورت 2011-07-21 ذخیره میشن میخواستم وقتی ازشون کوئری می گیرم به شمسی تبدیل بشن متاسفانه چون تازه کار هستم در وب هر چی گشتم مطالب مختلفی رو دیدم که برام قابل درک نبودن ممنون میشم راهنمایی کنید.
mrgraphy
چهارشنبه 01 آذر 1391, 12:41 عصر
سلام دوست عزیز.
اگر با 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 $jy.'-'.$jm.'-'.$jd;
}
//تاریخی که شما از دیتابیس میگیرید
$date = "21-07-2011";
// بعد باید تبدیلش کنید به آرایه
$date = explode('-',$date);
// یعد مقادیر آرایه رو میدید به تابع
echo gregorian_to_jalali($date[2],$date[1],$date[0]);
/* خروجیش این مقدار میشه
1390-4-30
*/
?>
امیدوارم کمکتون کرده باشم.
موفق باشید.
sharax
چهارشنبه 01 آذر 1391, 13:03 عصر
به نظر من یک سر به این سایت هم بزن ولی همونی هست که mrgraphy (http://barnamenevis.org/member.php?220481-mrgraphy) گفتند!
http://jdf.scr.ir/rahnama/?t=gregorian_to_jalali
سعید صابری
چهارشنبه 01 آذر 1391, 17:51 عصر
از طرف ديتابيس هم مي توني اين ميشه كار كرد تابعش در نت موجوده جستجو كنه به ديتابيست اضافه كن
mporki
پنج شنبه 02 آذر 1391, 16:12 عصر
سلام دوست عزیز.
اگر با 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 $jy.'-'.$jm.'-'.$jd;
}
//تاریخی که شما از دیتابیس میگیرید
$date = "21-07-2011";
// بعد باید تبدیلش کنید به آرایه
$date = explode('-',$date);
// یعد مقادیر آرایه رو میدید به تابع
echo gregorian_to_jalali($date[2],$date[1],$date[0]);
/* خروجیش این مقدار میشه
1390-4-30
*/
?>
امیدوارم کمکتون کرده باشم.
موفق باشید.
ممنون دوست عزیز کمکتون عالی بود مشکلم حل شد خدا خیرت بده
mrgraphy
چهارشنبه 08 آذر 1391, 11:57 صبح
سلام دوست عزیز.
در جواب سوال جدیدتون که فرمودید از این کد استفاده کنید.
بین تاریخ و زمان شما یک فاصله وجود دارد که از اون فاصله برای جدا کردن این دو استفاده میکنیم.
<?php
$fetched = '2011-07-21 22:32:14'; // مقداری که شما از دیتا بیس گرفتید
$fetched = explode(' ',$fetched); // جدا کردن تاریخ و زمان و تبدیل به آرایه
$date = $fetched[0]; // قرار دادن تاریخ در متغییر دیگری
?>
امید وارم کمکتون کرده باشم.
موفق باشید.
mporki
شنبه 11 آذر 1391, 18:36 عصر
سلام مجدد خدمت شما دوست عزیز از اینکه به سوالاتم پاسخ میدین ممنونم:پست آخرتون رومتوجه نشدم ممنون میشم مثل پاسخی که به پست قبلی دادین توضیح بدین من تونستم از طریق پاسخ اولتون تاریخ رو شمسی کنم اما زمان رو نمایش نمیده ممنون میشم با زبان ساده توضیح نمائید.و اگه هم کدی نیاز هست مثل پست قبلی برام بنویسید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.