parsgreen.com
article

تبدیل تاریخ میلادی به شمسی، با استفاده از مبدل jdf در php

php-date-time

یکی از دردسرهای همیشگی مدیران وبلاگ ها و سایت های فارسی زبان، مشکل نمایش تاریخ شمسی در صفحاتشان است، البته این مشکل برای سایت ها نمود بیشتری دارد چرا که وبلاگ ها معمولا از طریق سرویس دهنده خود می توانند تاریخ مطالب و محتوا را به بازدیدکنندگان به راحتی نشان دهند، اما در سایت ها وضع کمی فرق می کند، چرا که تاریخ قریب به اتفاق سرورها به میلادی است و از طرفی منطقه زمانی نیز در بیشتر سرورها بر روی GMT قرار دارد، در حالی که کشور ما ایران، به صورت استاندارد در منطقه زمانی 3:30+ GMT (و با تغییر ساعت در منطقه زمانی 4:30+ GMT) قرار گرفته است؛ در این مطلب می خواهیم به کمک برنامه مبدّل تاریخ هجری شمسی (jdf) که توسط برنامه نویسان ایرانی و به PHP نوشته و توسعه داده شده است، روش تبدیل تاریخ میلادی به شمسی را آموزش دهیم و مشکل منطقه زمانی را نیز حل کنیم.

دانلود مبدل تاریخ میلادی به شمسی به زبان php


قبل از بررسی ادامه آموزش، ابتدا آخرین نسخه برنامه مبدّل تاریخ هجری شمسی (jdf) را از سایت http://jdf.scr.ir دانلود یا از لینک زیر نسخه ای از آن را از وبگو دریافت کنید:
دانلود برنامه مبدّل تاریخ هجری شمسی (jdf)

تبدیل تاریخ استاتیک میلادی به شمسی


پس از دریافت فایل بالا، ابتدا تاریخ و زمان میلادی را به صورت Timestamp استاندارد (روز-ماه-سال) و (ثانیه-دقیقه-ساعت) از دیتابیس یا از سرور دریافت می کنیم، سپس پس از تجزیه موارد اضافه از طریق تابع explode در php و نهایتا تبدیل آرایه ها به متغیر با کمک list، با تابع mktime،  تاریخ و زمان را به صورت Unix در می آوریم؛ سپس تاریخ را به تابع jdate می دهیم و تبدیل شده شمسی آن را دریافت می کنیم؛ مثال زیر روشن است:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>وبگو | تبدیل تاریخ میلادی به شمسی</title>
<!-- http://webgoo.ir -->
<style type="text/css">
body{
    font-family:Tahoma, Geneva, sans-serif;
    font-size:12px;
}
</style>
</head>
<body>
<?php
$timezone = 0;//برای 3:30 عدد 12600 و برای 4:30 عدد 16200 را تنظیم کنید
$now = date("Y-m-d", time()+$timezone);
$time = date("H:i:s", time()+$timezone);
list($year, $month, $day) = explode('-', $now);
list($hour, $minute, $second) = explode(':', $time);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
include ('jdf.php');
$jalali_date = jdate("زمان: H:i:s - تاریخ: Y/m/d",$timestamp);
echo $jalali_date;
?>
<hr />
خروجی به صورت تاریخ و زمان نشان داده می شود
</body>
</html>
پیش نمایش
توضیح:
- چنانچه خطای Fatal error: Call to undefined function: date_default_timezone_set() on line 12 را دریافت کردید، خط مربوط به date_default_timezone_set را در لاین 12 حذف کنید یا به صورت کامنت در آورید (با افزودن // در ابتدای آن)، نمایش خطا به این دلیل است که قابلیت date_default_timezone_set تنها برای نسخه 5.1.0 به بعد در php قابل دسترس است.
- در کد بالا ما تاریخ را در متغیر now و زمان را در متغیر time داریم و اختلاف از GMT را برابر صفر قرار داده ایم (اگر زمان سرور شما بر روی GMT تنظیم شده است باید برای اختلاف 3:30 عدد 12600 و برای 4:30 عدد 16200 را قرار دهید).
- هر ساعت اختلاف از GMT برابر است با 60 دقیقه ضرب در 60 ثانیه (60*60) و نتیجه برابر است با 3600 ثانیه (یک ساعت برابر 3600 ثانیه)؛ 3:30 برابر می شود با 12600 و 4:30 برابر است با 16200 ثانیه.
- list، آرایه های حاصل از تجزیه با تابع explode را در مقادیر متغیرها ذخیره می کند.
- تابع jdate یکی از توابع مفید و اصلی فایل jdf.php است که تاریخ میلادی را به شمسی تبدیل می کند.
- نهایتا نیز متغیر jalali_date را به خروجی می دهیم. 
sectionدسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
» محاسبه و نمایش پیج رنک گوگل با php
» محدود کردن لینک دانلود مستقیم فایل ها با PHP و htaccess
» ساخت فید خوان آر اس اس (RSS Feed Reader) با php
» نمایش قسمتی از متن و پاراگراف با php
» ساخت منوی هوشمند با php و css!
commentنظرات (۷۱ یادداشت برای این مطلب ارسال شده است)
نویسنده: php کار
زمان: ۰۶:۲۸:۳۴ - تاریخ: ۱۳۹۱/۰۳/۲۴
من سایت jdf.scr.ir رو بررسی کردم.
تابع jdate پارامتر دوم رو اختیاری کرده.
یعنی اصلاً نیازی به این کدهای بالا نیست.
فقط کافیه بنویسید:
jdate echo ("زمان: H:i:s - تاریخ: Y/m/d")
خلاص.
اجباری به وارد کردن برچسب زمان نیست.
پاسخ: 
از timestamp برای تبدیل تاریخ استاتیک میلادی به شمسی استفاده کرده ایم، برای تاریخ و زمان فعلی حق با شما است، اما برای زمانی که تاریخ را در دیتابیس ذخیره کرده ایم، باید آن را با mktime برای تابع jdate قابل پردازش کنیم.
نویسنده: هادی
زمان: ۰۰:۱۳:۱۳ - تاریخ: ۱۳۹۱/۰۴/۱۲
سلام
برای تبدیل تاریخ میلادی به شمسی در برنامه هایی که تقویم باز شونده جدولی جهت انتخاب تاریخ از روی آن دارند چکار باید کرد؟
پاسخ: 
لطفا سوال خود را کمی واضح تر بپرسید، منظور شما دقیقا مشخص نیست، اما اگر فرم های بازشونده وب مد نظر است، باید تاریخ مقادیر option ها را قبل از اینکه به خروجی فرستاده شوند، از میلادی به شمسی تبدیل کنید، این کار نیازمند تسلط نسبی بر برنامه نویسی php و همچنین کد برنامه مورد نظر است.
نویسنده: هادی
زمان: ۱۱:۴۹:۳۶ - تاریخ: ۱۳۹۱/۰۴/۱۲
سلام
من یک برنامه crm را فارسی و بومی نمودم که تاریخ آن هم فارسی است منتها در قسمت تاریخ که می خواهیم تاریخ را وارد نماییم وارد فیلد که می شویم یک جدول تاریخ به میلادی باز می شود که باید انتخاب نماییم بعد از انتخاب و ذخیره سازی هم هر موقع که برنامه را نگاه کنیم تاریخ شمسی می باشد فقط در قسمت بالا میلادی می باشد آن هم صرفا جهت انتخاب؟
پاسخ: 
همان طور که در پاسخ قبلی گفتیم، باید تاریخی که در خروجی نشان داده می شود را پیدا کرده و آن را به فارسی تبدیل کنید، احتمالا نیاز به تغییراتی در کد فایل ها است، بدون دیدن کدها نمی توان بیشتر از این کمک کرد.
نویسنده: علي رضا
زمان: ۱۳:۵۹:۵۹ - تاریخ: ۱۳۹۱/۰۴/۲۹
سلام
مثلا اگر بخواهيم زمان و تاريخ رو در پايگاه داده ذخيره كنيم و هر جايي كه خواستيم فراخوان بكنيم بايد از چه دستوراتي استفاده كرد؟
معمولا كدهاي جاوا اسكريپت و php كه وجود داره فقط طي فرايندي تاريخ ميلادي رو به شمسي تبديل ميكنه! مثلا اگه ساعت سيستم كاربر عقب باشه همون ساعت رو به كاربر نشون ميده! اما من ميخواهم ساعتي رو كه در سرور يا پايگاه داده هست رو به كاربر نشون بدم!
لطفا كمكم كنيد!
پاسخ: 
سلام
جاوا اسکرپت چون یک زبان سمت کاربر است، اطلاعات خود را از مفسر مرورگر و در واقع از سیستم عامل می گیرد، به همین دلیل ساعت و زمان سیستم را نشان می دهد، اما در مورد php وضع فرق می کند، php در سرور اجرا می شود و لذا ساعت و زمان سرور را نشان می دهد و ارتباطی به سیستم عامل کاربر ندارد، شما با استفاده از کد و آموزش بالا یا با مراجعه به سایت
http://jdf.scr.ir
می توانید با کمی آشنایی با php تنظیمات مورد نظر خود را ایجاد کنید، در غیر این صورت (بدون آشنایی با php) انجام این کار کمی سخت می شود.
نویسنده: yki
زمان: ۱۸:۵۵:۰۲ - تاریخ: ۱۳۹۱/۰۵/۱۵
البتّه این نکته هم مهمه که همیشه تاریخ رو به صورت برچسب زمان که همون عدد معمولاً 10 رقمی هست ، در دیتابیس ذخیره کنیم تا هم فضای بسیار کمتری اشغال بشه و هم در زمان لازم ، تاریخ رو به هر قالب دلخواهی به نمایش در بیاریم.
یعنی فقط مقدار تابع time رو ذخیره کنیم و بس.
پاسخ: 
ممنون از توجه و مشارکت شما.
نویسنده: فریبا
زمان: ۱۱:۵۱:۰۳ - تاریخ: ۱۳۹۱/۰۷/۲۸
سلام
از مطالب عالیتون تشکر می کنم.
اگه بخوام تاریخ رو مثلاً به این صورت (سه شنبه 19 بهمن 1391) نشون بدم باید چه طور کد بزنم؟
پاسخ: 
سلام
کافی است در هنگام فراخوانی تابع در قسمت زیر:
$jalali_date = jdate("زمان: H:i:s - تاریخ: Y/m/d",$timestamp);
به جای Y/m/d از حرف l برای روزهای هفته، حرف d برای تاریخ عددی روز، حرف f برای نام فصل و Y برای سال استفاده کنید، در ضمن به بزرگ یا کوچک بودن حروف و چینش rtl یا ltr بودن نیز دقت کنید، مثال:
<?php
$jalali_date = jdate("l d f Y",$timestamp);
echo "<span dir=\"ltr\">$jalali_date</span>";
?>
نویسنده: علیرضا
زمان: ۱۵:۱۶:۰۲ - تاریخ: ۱۳۹۱/۰۸/۱۱
آقا واقعا توضیحات خوب و به درد بخوری دادید.
می خوام یه تشکر ویژه کنم که انقدر کار من رو راه انداختید
پاسخ: 
خواهش می کنیم، نظر لطف شما است.
نویسنده: Saeid Taei
زمان: ۰۹:۲۸:۵۵ - تاریخ: ۱۳۹۱/۰۸/۲۱
سلام دوستان
برای در آوردن تاریخ شمسی از این کد استفاده کنید
php تاریخ شمسی
<?php
function gregorian_to_Taei ($g_y, $g_m, $g_d){
static $g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
static $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 div($a, $b){
return (int)($a / $b);
}
$aa=gregorian_to_Taei (date('Y'), date('m'), date('d'));
//print_r($aa);
echo $aa[0].'/'.$aa[1].'/'.$aa[2];
?>
پاسخ: 
سلام
کد بسیار مفیدی است، خیلی ممنون از به اشتراک گذاری.
نویسنده: محمد کریمی
زمان: ۲۱:۱۰:۴۰ - تاریخ: ۱۳۹۱/۰۸/۲۲
با سلام
شما می تونید تاریخ یک سیستم رو برای من شمسی کنید؟
هزینش رو هم پرداخت می کنم ، کامپوننت jomsocial جوملا هست ، قسمت event رو می خوام شمسی کنم ، می تویند توی لینک زیر ببینید:
http://87.236.209.97/~emamsadeq/index.php?option=com_community&view=frontpage&Itemid=69
اگر می تونید با قیمت پیشنهادیتون ایمیل بزنید ، ممنون
پاسخ: 
سلام
در این خصوص لطفا به انجمن های جوملا فارسی مراجعه کنید.
نویسنده: armanzed
زمان: ۰۰:۴۶:۲۹ - تاریخ: ۱۳۹۱/۰۸/۳۰
اگه بخوایم تاریخ ذخیره شده در دیتابیس رو تبدیل کنیم چیکار باید بکنیم؟
نویسنده: armanzed
زمان: ۰۱:۳۵:۰۳ - تاریخ: ۱۳۹۱/۰۸/۳۰
ممنون داداش راه حلش رو پیدا کردم.
نویسنده: ansherli
زمان: ۱۳:۰۹:۴۲ - تاریخ: ۱۳۹۱/۱۰/۲۹
سلام
اول تشکر می کنم از سایت خوب و راهنمایی های خیلی خوبتون
ببخشید من می خواستم بدونم تاریخ و زمان رو بهتره چطور وارد دیتابیس بشه ؟ شمسی یا میلادی ؟ و به چه صورت در دیتابیس ذخیره بشه ؟ منظورم نوعش هست و اینکه در فیلدهای جدا باشه یا نه؟
و نحوه بیرون کشیدنش چطور باشه؟
من چند تا سایت رو دیدم هر کدوم یه روش رو میگن. چون تجربه ای در این زمینه ندارم می خواستم بدونم بهترین روش چیه؟
پاسخ: 
سلام
خواهش می کنیم، در مورد سوال شما، در درجه اول بستگی به هدف و نیاز شما دارد، به فرض اگر تاریخ را فقط جهت نمایش می خواهید می توانید به صورت شمسی ذخیره کنید (توصیه نمی شود، چون ممکن است بعدا تصمیم بگیرید که جهت محاسبات یا برای چینش از آنها استفاده کنید)، اما اگر می خواهید تاریخ هم در php و هم در دستورات mysql استفاده شود، به صورت datetime (نوع فیلد را در mysql به صورت DATETIME تنظیم کنید) و در یک فیلد ذخیره نمائید، مثال:
2013-1-18 14:59:33
به این صورت هم به تاریخ و زمان دسترسی دارید، هم می توانید با php آنها را به شمسی (یا سایر فرمت های میلادی) تبدیل کنید، هم در mysql از توابع درونی استفاده نمائید.
نویسنده: ansherli
زمان: ۲۱:۵۲:۱۶ - تاریخ: ۱۳۹۱/۱۰/۲۹
ببخشید من به صورت زیر تاریخ و زمان را وارد دیتابیس کردم و نوع فیلد رو Datetime کردم.
$datetime = date("Y-m-d H:i:s",$timestamp);// درج تاریخ  و زمان به صورت میلادی در دیتابیس
2013-01-18 20:00:29
حالا برای اینکه تاریخ و زمان ثبت شده در دیتابیس که میلادی هست رو تبدیل به شمسی کنم چیکار کنم ؟
کد شما تاریخ و زمان زمان جاری سیستم رو میده . نمیدونم چطور باید مقدار فیلد datetime رو به عنوان ورودی به تابع بدم تا تبدیل به شمسی بکنه؟!!!!
ممنون میشم راهنماییم کنید
پاسخ: 
این کار چندان سخت نیست، ابتدا با دستور select from تاریخ مورد نظر را از دیتابیس استخراج کنید و به یک متغیر نسبت دهید:
$datetime = '2013-01-18 20:00:29';
سپس از فاصله خالی بین تاریخ و زمان استفاده کرده و با تابع explode آنها را به آرایه با دو کلید و مقدار تبدیل کنید:
$split_date_time = explode(' ', $datetime);
اگر با print_r از متغیر split_date_time خروجی بگیرید خواهید داشت:
Array
(
[0] => 2013-01-18
[1] => 20:00:29
)
اکنون از دو کلید و مقدار آنها می توانید استفاده کنید:
list($year, $month, $day) = explode('-', $split_date_time[0]);
list($hour, $minute, $second) = explode(':', $split_date_time[1]);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
نویسنده: ansherli
زمان: ۱۱:۴۷:۵۷ - تاریخ: ۱۳۹۱/۱۱/۱۷
سلام
ببخشید من بازم به مشکل برخوردم
این کدم هست:
<?php
mysql_connect("localhost", "root", "") or die(mysql_error());
mysql_select_db("site");
$q="select * from akhbar ";
$result= mysql_query($q);
while ($row=mysql_fetch_array($result))
{
$split_date_time = explode(' ', $row['3']);
list($year, $month, $day) = explode('-', $split_date_time[0]);
list($hour, $minute, $second) = explode(':', $split_date_time[1]);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
include ('jdf.php');
$jalali_date = jdate("زمان: H:i:s - تاریخ: Y/m/d",$timestamp);
echo $jalali_date;
}
?>
خروجی :
زمان: ۱۷:۲۰:۰۸ - تاریخ: ۱۳۹۱/۱۱/۱۲
Fatal error: Cannot redeclare jdate() (previously declared in C:\wamp\www\admin\jdf.php:8) in C:\wamp\www\admin\jdf.php on line 208
فقط یه تاریخ و زمان رو بیرون میکشه و همراه این خطا!
من از سایت jdf.scr.ir هم راهنمایی خواستم ولی اونم با خطا اجرا میشه ! البته کد زیر رو با همون jdf.php که توی سایتشون گذاشته بودن اجرا کردم.
کد رو ببینید:
<?php
//تاریخ شما: $datetime = date("Y-m-d H:i:s",$timestamp);
include_once('jdf.php');
ereg ('([0-9]{4})-([0-9]{1,2})-([0-9]{1,2}) ([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})', $datetime, $d_t_a);
$jalali_date=jdate('زمان: H:i:s - تاریخ: d/m/Y', mktime($d_t_a[4],$d_t_a[5],$d_t_a[6],$d_t_a[2],$d_t_a[3],$d_t_a[1]),'','gmt','fa');
// خروجی $jalali_date
توضیحات کد:
می توانید به روش زیر ، تاریخ رو از دیتابیس خوانده و در متغیّر datetime ذخیره کنید و ...
به پارامترهای تابع jdate دقّت کنید. به جای gmt ، منطقه ی زمانی سرور در هنگام ذخیره ی تاریخ ها در دیتابیس را وارد نمایید. منظور ، همان منطقه ی زمانی است که طبق آن ، زمان را در دیتابیس ذخیره کرده بودید.
و در صورت تمایل به تبدیل ساعت ها به وقت ایران ، به جای gmt باید Asia/Tehran را وارد کنید.
و اگر قصد استفاده از ارقام خروجی در محاسبات ریاضی را داشتید ، به جای fa ، باید en وارد شود تا اعداد ، به صورت انگلیسی خارج شوند.
در ضمن ، مقدار پیشفرض پارامترهای 3 و 4 و 5 jdate ، '' و 'Asia/Tehran' و 'fa' است و در صورت هماهنگی با مقادیر مورد نظر شما ، می توانید این سه پارامتر را که اختیاری نیز هستند ، وارد نکنید.
خطایی که داشتم:
Deprecated: Function ereg() is deprecated
این جواب رو بهم دادن:
این خطا به نسخه ی php سرور شما مربوط میشه.
نسخه php رو تغییر دادم ولی بازم همون خطا رو دارم:
نسخه جدیدم:
MySQL client version: mysqlnd 5.0.8-dev - 20102224 - $Revision: 321634 $
میشه دوباره راهنماییم کنید چیکار کنم؟ :(
پاسخ: 
سلام
روشی که گفتیم را استفاده کنید، منتها فایل jdf.php را در خارج از حلقه while قرار دهید، در غیر این صورت در هر بار دور حلقه، یک بار فایل وارد شده که صحیح نیست و باعث بروز خطا می شود، راه حل دیگر این مشکل استفاده از include_once یا require_once به جای include است.
درمورد تابع ereg، این تابع از نسخه 5.3 و به بعد جزء توابع قبیح دانسته شده است و ممکن است در نسخه های بعدی php حذف شود، لذا بهتر است از آن استفاده نکنید.
http://www.php.net/manual/en/function.ereg.php
در مورد نسخه php، از کد زیر استفاده کنید، نسخه php در هدر صفحه مشخص است.
echo phpinfo();
نویسنده: جلال
زمان: ۱۰:۳۷:۲۸ - تاریخ: ۱۳۹۱/۱۱/۲۸
لطفا همین مطلب را (تبدیل تاریخ میلادی به شمسی رادرjavascript) توضیح دهید.
پاسخ: 
برای تبدیل تاریخ شمسی به میلاد با جاوا اسکریپت نیاز به نوشتن توابعی است که متاسفانه تا آنجا که می دانیم چنین کاری تا این لحظه صورت نگرفته است، البته شاید علت آن ماهیت خاص جاوا اسکریپت و سمت کاربر بودن آن باشد (که باعث می شود تنظیمات از سیستم عامل دریافت شود نه از سرور) و لذا بیشتر افراد ترجیح می دهند از ترکیب آن با php یا دیگر زبان های سمت سرور استفاده کنند.
paged صفحه 1 از 5




more لطفا دقت کنید که یادداشت های زیر منتشر نشده و حذف خواهند شد:
- یادداشت های خارج از موضوع این مطلب.
- سوالات کلی، غیر ضروری و مشکلاتی که هیچ تلاشی برای رفع آن نکرده باشید.
- نظرات حاوی کدها و اسکریپت های خیلی طولانی (به طور مثال کد کامل قالب وبلاگ).

7 × 8
 refresh
آگهی
seonab.com
طراحی نرم افزار اندروید
رنگین کمان عکس
Ranginkamaan.com

آرشیو عکس های باکیفیت با موضوعات متنوع...