article

تبدیل تاریخ میلادی، شمسی با مبدل JDF در PHP

php-date-time

یکی از موارد پرکاربرد در طراحی و برنامه نویسی سایت ها و صفحات فارسی زبان نمایش تاریخ هجری شمسی به اشکال مختلف است، برنامه نویسان وب معمولا برای سازگاری و ایجاد قابلیت های چندگانه در برنامه هایشان به صورت پیش فرض در ساختار، سورس کدها و فیلدهای دیتابیس از تاریخ میلادی استفاده می کنند که جنبه درون برنامه ای دارد و به صورت ذاتی با توابع یا امکانات سرور و پایگاه داده سازگار است، اما اگر بخواهیم این فرمت های پیش فرض را به صورت محلی و به زبان کاربر نمایش دهیم قاعدتا باید آنها را بر اساس فرمول و قاعده خاص گاهشماری مقصد تبدیل کنیم، بر همین اساس یکی از رایج ترین این موارد تبدیل تاریخ میلادی به هجری شمسی در PHP است که برای آن مبدلی تحت عنوان JDF توسط برنامه نویسان فارسی زبان نوشته و توسعه داده شده که در این مطلب می خواهیم با چند و چون کار و نحوه استفاده از آن آشنا شویم.

مبدل JDF چیست؟


همان طور که از معنی عبارت "مبدل" مشخص است، JDF تبدیل کننده تاریخ از میلادی به شمسی و از شمسی به میلادی است که برای این منظور از چند تابع مختلف که همگی در یک فایل PHP گنجانده شده اند استفاده می کند، این دستورات و توابع توسط برنامه نویسان سایت "مرکز دریافت بسته های کاربردی" به آدرس
https://scr.ir
نوشته و توسعه داده شده اند که در همین آدرس می توانیم تاریخچه و راهنمای کاملی از نحوه شکل گیری و تکامل این ابزار را مطالعه کنیم.

آیا برای نمایش تاریخ هجری شمسی، JDF تنها راه حل است؟!


قاعدتا خیر، یادآور می شویم در صورت مطالعه و آشنایی با اصول تقویم میلادی و گاهشمار هجری شمسی، تسلط بر برنامه نویسی و صرف وقت و حوصله کافی می توانیم توابع شخصی و مشابه حداقل جهت رفع نیازهای عادی طراحی کنیم، به عبارتی استفاده از JDF تنها روش برای تبدیل و نمایش تاریخ به صورت هجری شمسی نیست و راه برای ایجاد توابع و شیوه های سفارشی و جدید همواره باز است، JDF یک راه حل دم دستی، جامع، سریع و البته حرفه ای و خوب است که با توجه به رایگان بودن آن می تواند در هر کجا که نیاز باشد مورد استفاده قرار گیرد.

دانلود JDF، مبدل تاریخ میلادی، شمسی به زبان PHP


قبل از پرداختن به ادامه آموزش، ابتدا آخرین نسخه مبدل تاریخ میلادی، هجری شمسی (JDF) را از آدرس 
http://jdf.scr.ir
دانلود یا از لینک زیر نسخه ای از آن را از «وبگو» دریافت کنید:
دانلود JDF، مبدل تاریخ میلادی به هجری شمسی - تاریخ به روزرسانی فایل ZIP در «وبگو»: آبان 1396

نحوه استفاده از فایل jdf.php در برنامه ها


پس از دانلود فایل مبدل تاریخ میلادی به شمسی و شمسی به میلادی JDF، قاعدتا اولین کار include کردن آن در سورس کدهای برنامه PHP است که به روش نمونه زیر انجام می شود:
include_once('jdf.php');
به این ترتیب توابع این فایل در کدها در دسترس و قابل استفاده خواهند بود، فایل jdf.php چندین تابع مختلف را در خود جای داده اما برای کاربردهای عادی سه تابع jdate، gregorian_to_jalali و jalali_to_gregorian بیشترین اهمیت را دارند که در خصوص کارکرد و نحوه استفاده از آنها در ادامه به صورت موردی صحبت خواهیم کرد.
نکته: چنانچه خطای 
Fatal error: Call to undefined function: date_default_timezone_set()
را دریافت کردید، خط مربوط به date_default_timezone_set را در خطوط ابتدایی فایل jdf.php حذف یا (با افزودن // در ابتدای آن) به صورت کامنت در آورید، نمایش خطا به این دلیل است که قابلیت date_default_timezone_set تنها برای نسخه 5.1.0 به بعد در PHP قابل دسترس است.

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


برای تبدیل تاریخ میلادی به هجری شمسی ابتدا باید دید تاریخ میلادی با چه فرمتی در کدهای PHP استفاده یا در فیلدهای دیتابیس ذخیره شده است، برنامه نویسان معمولا از دو فرمت رایج Unix، به طور مثال:
1510803458
یا تاریخ و زمان به صورت استاندارد، به طور مثال:
2017-11-16 03:37:38
استفاده می کنند، Unix یک مقدار عددی قابل فهم برای ماشین است که بر اساس اختلاف زمان به ثانیه از مبدا GMT یعنی نیمه شب (ساعت 0) 1 ژانویه 1970 میلادی تا زمان مقصد محاسبه شده و با تبدیل آن بر اساس فرمول های خاص می توانیم تاریخ و زمان مد نظر را به شکل قابل فهم برای انسان بدست آوریم، در حالت Unix فرآیند تبدیل تاریخ میلادی به شمسی ساده خواهد بود، کافی است مقدار عددی را به صورت برچسب زمان به عنوان آرگیومنت به تابع jdate داده و معادل تاریخ هجری شمسی آن را با توجه به تنظیمات در خروجی دریافت کنیم، به فرض:
<?php
$timestamp = '1510803458';
$jalali_date = jdate("تاریخ:Y/m/d زمان:H:i:s", $timestamp);
?>
<div class="rtl"><?php echo $jalali_date; ?></div>
با اجرای این کد در خروجی تاریخ هجری شمسی چاپ خواهد شد، نکته مهم این کد نحوه استفاده از آرگیومنت های تابع jdate است که مشابه با تابع date در PHP هر حرف لاتین نماد یک شکل از تاریخ و زمان در این تابع است، به طور مثال حرف Y سال شمسی را به صورت عددی و کامل چاپ می کند، برای مشاهده جدول راهنمای این حروف می توانیم به آدرس زیر مراجعه نمائیم:
https://jdf.scr.ir/rahnama/?t=jdate
اما اگر تاریخ و زمان کدهای PHP یا مقادیر ذخیره شده در دیتابیس به صورت Unix نباشد، ابتدا باید تاریخ و زمان میلادی را به صورت فرمت استاندارد (سال-ماه-روز ساعت:دقیقه:ثانیه) دریافت کرده سپس پس از تجزیه تاریخ و زمان از طریق تابع explode در PHP و نهایتا تبدیل آرایه های حاصله به متغیر با کمک list، با استفاده از تابع mktime تاریخ و زمان را به صورت Unix و برچسب زمان (Timestamp) در آوریم، سپس مقدار عددی Unix را به عنوان آرگیومنت به تابع jdate داده و در نهایت تبدیل شده شمسی آن را دریافت می کنیم، مثال زیر روشن است:
<?php
$date = '2017-11-16 03:37:38';
$array = explode(' ', $date);
//print_r($array);
list($year, $month, $day) = explode('-', $array[0]);
list($hour, $minute, $second) = explode(':', $array[1]);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
//echo $timestamp;
$jalali_date = jdate("تاریخ:Y/m/d زمان:H:i:s", $timestamp);
?>
<div class="rtl"><?php echo $jalali_date; ?></div>
در صورتی که از آرایه با دستور print_r خروجی بگیریم تاریخ و زمان به صورت جداگانه چاپ خواهند شد:
Array ( [0] => 2017-11-16 [1] => 03:37:38 )
اگر از متغیر timestamp نیز با دستور echo خروجی بگیریم مقدار عددی 1510803458 چاپ خواهد شد.
نکته 1: تابع jdate درون خود از تابع gregorian_to_jalali استفاده می کند، در واقع تاریخ میلادی به این تابع داده شده و معادل شمسی آن به صورت آرایه (سال، ماه و روز) یا رشته متنی (در صورتی که آرگیومنت چهارم تنظیم شود) برگردانده می شود، سپس تابع jdate با استفاده از این اطلاعات بر اساس تنظیمات کاربر خروجی نهایی را چاپ می کند.
نکته 2: تابع jdate برای نمایش تاریخ و زمان فعلی سرور بصورت هجری شمسی نیز مورد استفاده قرار می گیرد، در این صورت نیازی به آرگیومنت دوم یعنی برچسب زمان نیست، مثال:
echo jdate("تاریخ:Y/m/d زمان:H:i:s");
نکته 3: در صورتی که تاریخ و زمان در فیلدهای دیتابیس ذخیره شده باشند، قاعدتا ابتدا باید با اجرای پرس و جو از دیتابیس استخراج و سپس به متغیر PHP نسب داده شوند، به طور مثال:
<?php
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn) {
    echo "Error!: " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
    exit;
} else {
    $id = mysqli_real_escape_string($conn, @$_GET['id']);
    $sql = "SELECT date_col FROM tbl WHERE id = $id LIMIT 1";
    $query = mysqli_query($conn, $sql);
    if(!$query) {
        echo "Error!: " . mysqli_error($conn);
    } else {
        while($row = mysqli_fetch_array($query)){
            $date = $row['date_col'];
        }
    }
}
mysqli_close($conn);
?>
در این مثال از اکستنشن MySQLi در حالت برنامه نویسی رویه ای (Procedural) استفاده شده که روشی عمومی و به اصطلاح دم دستی است، قاعدتا برای حالت های پیشرفته  تر می توانیم از حالت شی گرا یا اکستنشن PDO نیز استفاده کنیم (در عمل صرفا خروجی برایمان ملاک است و تفاوتی بین روش ها از این نظر وجود ندارد).

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


اگرچه برای تبدیل تاریخ میلادی به هجری شمسی استفاده از تابع jdate کفایت می کند، اما به جهت اینکه خود این تابع از تابع دیگری به نام gregorian_to_jalali استفاده می کند، بد نیست این تابع را نیز بررسی کنیم.
function gregorian_to_jalali($gy, $gm, $gd, $mod='')
تابع gregorian_to_jalali تاریخ میلادی را به صورت سه آرگیومنت (سال، ماه و روز) دریافت و تبدیل شده شمسی آن را بر اساس محاسبات مربوط به تبدیل تاریخ ها به عنوان نتیجه به صورت آرایه یا رشته متنی بر می گرداند، آرگیومنت چهارم این تابع با عنوان mod می تواند یک علامت متنی مانند - یا / باشد، در این صورت نتیجه به صورت رشته متنی برگردانده می شود، نمونه کد نحوه استفاده مستقیم از این تابع:
<?php
$timezone = 0;
$year = date('Y', time() + $timezone);
$month = date('n', time() + $timezone);
$day = date('j', time() + $timezone);
print_r(gregorian_to_jalali($year, $month, $day));
?>
که خروجی نمونه کد بالا به صورت زیر خواهد بود:
Array ( [0] => 1396 [1] => 8 [2] => 25 )
اگر آرگیومنت چهارم مقداردهی شود خروجی به صورت رشته متنی خواهد بود:
echo gregorian_to_jalali($year, $month, $day, '/');
که در اینصورت خروجی برابر است با:
1396/8/25
نکته 1: در نمونه کد بالا اختلاف از GMT را در متغیر دلخواه timezone برابر 0 قرار داده ایم، اگر زمان سرور شما بر روی GMT تنظیم شده است باید برای سازگاری با زمان محلی ایران، اختلاف 3:30 از GMT عدد 12600 و برای 4:30 (شش ماهه اول سال، ساعت تابستانی) عدد 16200 را برای متغیر timezone قرار دهید، هر ساعت اختلاف از GMT برابر است با 60 دقیقه ضرب در 60 ثانیه (60*60) و نتیجه برابر است با 3600 ثانیه (یک ساعت برابر 3600 ثانیه)، 3:30 برابر می شود با 12600 و 4:30 برابر است با 16200 ثانیه.
نکته 2: تنها تفاوت بین استفاده از حروف n و j با m و d در تابع date در این است که اعداد کوچکتر از 10 به صورت بدون صفر یا با صفر در ابتدا نمایش داده می شوند (به طور مثال 8 یا 08).

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


function jalali_to_gregorian($jy, $jm, $jd, $mod='')
مشابه آنچه در خصوص تابع gregorian_to_jalali گفتیم در اینجا نیز کافی است سال، ماه و روز مد نظر در تاریخ هجری شمسی را به عنوان آرگیومنت به تابع jalali_to_gregorian بدهیم و تبدیل شده میلادی آن را بر اساس محاسبات خاص به صورت آرایه یا در صورتی که آرگیومنت چهارم تنظیم شود، به صورت رشته متنی دریافت کنیم، مثال زیر روشن است:
<?php
$date = '1396/8/25';
$array = explode('/', $date);
$year = $array[0];
$month = $array[1];
$day = $array[2];
print_r(jalali_to_gregorian($year, $month, $day));
?>
که خروجی نمونه کد بالا به شکل زیر خواهد بود:
Array ( [0] => 2017 [1] => 11 [2] => 16 )
اگر آرگیومنت چهارم مقداردهی شود خروجی به صورت رشته متنی خواهد بود:
echo jalali_to_gregorian($year, $month, $day, '/');
که در اینصورت خروجی برابر است با:
2017/11/16
همانطور که مشخص است برای اینکه خروجی به صورت رشته متنی باشد، کافی است آرگیومنت چهارم را با یک علامت مانند - یا / مقداردهی و به جای print_r از echo استفاده کنیم.

مثال و پیش نمایش آنلاین


برای جمع بندی این آموزش مثال ها و پیش نمایش آنلاین تبدیل تاریخ میلادی به شمسی و شمسی به میلادی را در قالب یک فایل تست و بررسی می کنیم:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | تبدیل تاریخ میلادی، شمسی</title>
<!-- Webgoo.ir -->
<style type="text/css">
body{
    direction:rtl;    
}
.ltr{
    direction:ltr;
}
.rtl{
    direction:rtl;
}
</style>
</head>
<body>
<?php
include_once('jdf.php');
$date = '2017-11-16 03:37:38';
$array = explode(' ', $date);
list($year, $month, $day) = explode('-', $array[0]);
list($hour, $minute, $second) = explode(':', $array[1]);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
$jalali_date = jdate("تاریخ:Y/m/d زمان:H:i:s", $timestamp);
?>
<div class="rtl"><?php echo $jalali_date; ?></div>
<?php
$date = '1396/8/25 03:37:38';
$array = explode(' ', $date);
list($year, $month, $day) = explode('/', $array[0]);
$gregorian_date = 'Date:' . jalali_to_gregorian($year, $month, $day, '-') . ' Time:' . $array[1];
?>
<div class="ltr"><?php echo $gregorian_date; ?></div>
<hr>
با توجه به اینکه بیشتر توابع و امکانات درونی MySQL صرفا با تاریخ میلادی سازگار هستند، توصیه می شود تاریخ دیتابیس را همواره به صورت میلادی با یکی از فرمت های استاندارد یا به صورت Unix ذخیره کنیم و صرفا در حالت نمایشی از تاریخ هجری شمسی استفاده نمائیم.
</body>
</html>
پیش نمایش
sectionدسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
» ساخت منوی هوشمند با PHP و CSS
» نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
» ارسال پارامتر به URL و دریافت مقادیر با PHP
» ارسال ایمیل با PHP و کلاس phpmailer
» دریافت و نمایش پیج رنک گوگل با PHP
commentنظرات (۸۳ یادداشت برای این مطلب ارسال شده است)
more یادداشت های جدید بر اساس تاریخ ارسال در انتهای یادداشت های موجود نمایش داده می شوند.
نویسنده: php کار
۰۶:۲۸ ۱۳۹۱/۰۳/۲۴
من سایت jdf.scr.ir رو بررسی کردم.
تابع jdate پارامتر دوم رو اختیاری کرده.
یعنی اصلاً نیازی به این کدهای بالا نیست.
فقط کافیه بنویسید:
jdate echo ("زمان: H:i:s - تاریخ: Y/m/d")
خلاص.
اجباری به وارد کردن برچسب زمان نیست.
پاسخ: 
از timestamp برای تبدیل تاریخ استاتیک میلادی به شمسی استفاده کرده ایم، برای تاریخ و زمان فعلی حق با شما است، اما برای زمانی که تاریخ را در دیتابیس ذخیره کرده ایم، باید آن را با mktime برای تابع jdate قابل پردازش کنیم.
نویسنده: هادی
۰۰:۱۳ ۱۳۹۱/۰۴/۱۲
سلام
برای تبدیل تاریخ میلادی به شمسی در برنامه هایی که تقویم باز شونده جدولی جهت انتخاب تاریخ از روی آن دارند چکار باید کرد؟
پاسخ: 
لطفا سوال خود را کمی واضح تر بپرسید، منظور شما دقیقا مشخص نیست، اما اگر فرم های بازشونده وب مد نظر است، باید تاریخ مقادیر option ها را قبل از اینکه به خروجی فرستاده شوند، از میلادی به شمسی تبدیل کنید، این کار نیازمند تسلط نسبی بر برنامه نویسی PHP و همچنین کد برنامه مورد نظر است.
نویسنده: هادی
۱۱:۴۹ ۱۳۹۱/۰۴/۱۲
سلام
من یک برنامه crm را فارسی و بومی نمودم که تاریخ آن هم فارسی است منتها در قسمت تاریخ که می خواهیم تاریخ را وارد نماییم وارد فیلد که می شویم یک جدول تاریخ به میلادی باز می شود که باید انتخاب نماییم بعد از انتخاب و ذخیره سازی هم هر موقع که برنامه را نگاه کنیم تاریخ شمسی می باشد فقط در قسمت بالا میلادی می باشد آن هم صرفا جهت انتخاب؟
پاسخ: 
همان طور که در پاسخ قبلی گفتیم، باید تاریخی که در خروجی نشان داده می شود را پیدا کرده و آن را به فارسی تبدیل کنید، احتمالا نیاز به تغییراتی در کد فایل ها است، بدون دیدن کدها نمی توان بیشتر از این کمک کرد.
نویسنده: علي رضا
۱۳:۵۹ ۱۳۹۱/۰۴/۲۹
سلام
مثلا اگر بخواهيم زمان و تاريخ رو در پايگاه داده ذخيره كنيم و هر جايي كه خواستيم فراخوان بكنيم بايد از چه دستوراتي استفاده كرد؟
معمولا كدهاي جاوا اسكريپت و php كه وجود داره فقط طي فرايندي تاريخ ميلادي رو به شمسي تبديل ميكنه! مثلا اگه ساعت سيستم كاربر عقب باشه همون ساعت رو به كاربر نشون ميده! اما من ميخواهم ساعتي رو كه در سرور يا پايگاه داده هست رو به كاربر نشون بدم!
لطفا كمكم كنيد!
پاسخ: 
سجاوا اسکرپت چون یک زبان سمت کاربر است، اطلاعات خود را از مفسر مرورگر و در واقع از سیستم عامل می گیرد، به همین دلیل ساعت و زمان سیستم را نشان می دهد، اما در مورد PHP وضع فرق می کند، PHP در سرور اجرا می شود و لذا ساعت و زمان سرور را نشان می دهد و ارتباطی به سیستم عامل کاربر ندارد، شما با استفاده از کد و آموزش بالا یا با مراجعه به سایت
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 یا دیگر زبان های سمت سرور استفاده کنند.
more لطفا پیش از ارسال یادداشت نکات زیر را مد نظر داشته باشید:
- موارد غیرمرتبط با مباحث آموزش ها را در فرم منوی "تماس با ما" مطرح و پاسخ را از طریق ایمیل دریافت کنید.
- به سوالات کلی، مبهم و مشکلاتی که تلاشی برای رفع آن نکرده باشید پاسخ مختصر داده خواهد شد.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین قرار دهید تا امکان تست و بررسی وجود داشته باشد.
- از درج عناوین تبلیغاتی در فیلدها خودداری کنید، در صورتی که یادداشت تبلیغاتی تشخیص داده شود حذف خواهد شد.
- تمام یادداشت ها بررسی و زمانی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد خودداری کنید.





9 × 3
 refresh

آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
form عبدالمالت ریالی
در:
سلام علیک میشه از چند فونت در یک صفحه html استفاده کرد.؟
۱۳۹۹/۰۸/۰۱

form مبینا
در:
سلام من برنامه ای میخواستم که داخل ارایه 5 رنگ قرار گرفته باشه. و با استفاده از حلقه for این یک متنو به اون پنج...
۱۳۹۹/۰۸/۰۱

form mohadeseh
در:
ممنون از راهنماییتون مشکلم حل شد
۱۳۹۹/۰۷/۲۸

form محمد
در:
سلام. یک کد نوشته ام بدین صورت: وقتی صفحه باز شده یک پنجره پیام خالی با یک ok باز شده هر چه ok را...
۱۳۹۹/۰۷/۲۸

form فایز پور جهانبخشی
در:
سلام اگر بخواهیم برنامه ای که داخل متلب نوشتیم تا یک ثانیه اجرا شود و بعد از ثانیه اول در حالت خطا که...
۱۳۹۹/۰۷/۲۸

form mohadeseh
در:
الان کد من که توی تگ <head> گزاشتم میخواستم بدونم ایا امکانش هست که توی تگ link که ایکون رو باهاش اوردم بتونم...
۱۳۹۹/۰۷/۲۷

form mohadeseh
در:
سلام ببخشید لطفا راهنمایی کنید که چجوری title برای favicon در html بزارم؟ جوری که وقتی موس روی icon قرار بگیره متن...
۱۳۹۹/۰۷/۲۷

form ryomaechizen
در:
سلام. اگه حافظه وب پر بشه و مجبورا عکسا کپی باشن چطور باید مشکل بارگزاریشون حل بشه؟
۱۳۹۹/۰۷/۲۶

form رونا
در:
پرونده فرستاده شده نمی‌تواند به wp-content/uploads/2020/10 برود. سلام این ارور برای چی رخ می ده
۱۳۹۹/۰۷/۲۵

form reza
در:
سلام خوبید انشاالله؟ خواستم بدونم این نوار ابزار رو چطور باید اونایی رو دوست دارم بزارم سمت راست وبلاگم. هر چی کد و ......
۱۳۹۹/۰۷/۲۴

form سینا
در:
چگونه میتوانیم با استفاده از HTML فرمول شیمیایی مواد را بنویسیم؟ با عدد اتمی، جرمی و بار اتمی
۱۳۹۹/۰۷/۲۱

form فاطمه
در:
سلام ممنونم... خیلی ساده و روون توضیح دادین.. اونقدر که تشویق شدم محتوای یه فایل تکس رو با ایجکس درون یه div بیارم ولی...
۱۳۹۹/۰۷/۲۱

form امیرحسین
در:
خب متوجه شدم. که باید خط اول عدد فانکشن رو تغییر بدم. بسته به تعداد آرایه یا هر عدد دیگه تغییر بدم جوابمو...
۱۳۹۹/۰۷/۲۱

form امیرحسین
در:
عالی بود. خیلی ممنونم. ولی هر چند کلمه داخل آرایه داشته باشم به همون میزان خروجی گرفته میشه. من اگه 10 کلمه در آرایه داشته...
۱۳۹۹/۰۷/۲۱

form سعادتی
در:
سلام کاش روش برطرف کردن این بهم ریختگی رو هم توضیح میدادید. ممنون
۱۳۹۹/۰۷/۲۰
form امیرحسین
در:
موفق شدم اینو پیدا کنم. ولی میخوام کلمات تکراری داخلشون نباشه. مثال AAA فقط یک بار در اون خط وجود داشته باشه.
۱۳۹۹/۰۷/۲۰
form امیرحسین
در:
سلام. نه محدودیت زمانی وجود نداره.
۱۳۹۹/۰۷/۲۰
form امیرحسین
در:
سلام خسته نباشید. میخوام از این تابع برای بدست آوردن لیست های متفاوت استفاده کنم. مثلا یه آرایه داشته باشم. امیدوارم کمکم...
۱۳۹۹/۰۷/۲۰
form ابوالفضل
در:
سلام وقتتون بخیر من میخوام یه افزونه برای مرورگر کروم طراحی کنم و میخوام یه متنی رو هر سری از سایت دریافت کنه و...
۱۳۹۹/۰۷/۲۰
form mahdi
در:
سلام چطور می تونم از ip خارجی استفاده کنم؟ برای دریافت لانچر میخام. مرسی
۱۳۹۹/۰۷/۱۹
form احسان عباسی
در:
با سلام و تشکر از سایت خوبتون من یه کد تعریف کردم که در بورس ایران سهم مدنظرمو بیاره .. میخواستم ببینم امکانش هست دستوری...
۱۳۹۹/۰۷/۱۷
form شبنم
در:
سلام وقتتون بخیر، ببخشید از کلمه event یا e دقیقا چه زمانی توی فانکشن استفاده میکنیم؟
۱۳۹۹/۰۷/۱۷
form احمد
در:
با عرض سلام مجدد ساختار کلی دستورم به این صورت هست. بعد از حلقه وایل اون دیو کلاس 1 و 2 و 3 میخواهم...
۱۳۹۹/۰۷/۱۶
form احمد
در:
با عرض سلام ببخشید چطوری میتونم یه قسمت از تگ ها رو داخل حلقه وایل رد کنم دوباره تگ های بعدی داخل حلقه قرار بگیرن...
۱۳۹۹/۰۷/۱۶
form ابوالفضل
در:
سلام واقعا من خیلی گشتم تا بتونم این آموزش رو پیدا کنم چون واقعا نمی دونستم چی بنویسم تا یک رتبه بندی برای نتایج جستجو...
۱۳۹۹/۰۷/۱۵
form mahtab
در:
سلام وقتتون بخیر ببخشید میشه بفرمایید چجوری کلیپ رو بزاریم وبلاگ ؟؟ بی زحمت کامل بفرمایین ممنون و متشکر
۱۳۹۹/۰۷/۱۴
form Saeid Azari
در:
سلام ببخشید اگه امکانش هست سوال منو جواب بدید یکم گیج شدم...من یک کد html دارم که باید یک سایت درست کنم و ان را...
۱۳۹۹/۰۷/۱۳
form ابوالفضل
در:
سلام یک سوال دارم چجوری یک متنی که درون تگ td هست و بعد تگ br هست (تگ br درون تگ td است) رو...
۱۳۹۹/۰۷/۱۳
form parnian
در:
با سلام با توجه به این که این مطلب در سال 91 نوشته شده ایا تغیری هم کرده؟ مثلا استفاده و مهم بودن تگ های...
۱۳۹۹/۰۷/۱۳
form fahimeh
در:
سلام من دارم پروژه واسه دانشگاه مینویسم طراحی سایتو کردم برای کار با پایگاه داده دستور insert و delete کار میکنه ولی...
۱۳۹۹/۰۷/۱۲
form امین
در:
با عرض سلام ببخشید یه فرم دارم اخر فرمم یه دکمه دارم میخواستم بدونم چطوری باید بعد از کلیک کردن دکمه به صفحه دیگه انتقال...
۱۳۹۹/۰۷/۱۱
form محسن
در:
سلام من از فرم ساز گرویتی استفاده میکنم آیا امکان استفاده همچین چیزی رو میتونم داخلش داشته باشم آیا کدی داره که در قسمت...
۱۳۹۹/۰۷/۱۱
form مالکی
در:
چرا وبلاگم بالا نمی یاد
۱۳۹۹/۰۷/۰۹
form احمد
در:
با عرض سلام مجدد و خسته نباشید ببخشید نمونه کد رو اگر امکانش هست نگاه کنید که چطوری این متغییری رو که بدست اوردم در...
۱۳۹۹/۰۷/۰۹
form الناز
در:
سلام وقتتون بخیر. چطور میشه برنامه ای رو در php نوشت که کدملی رو تبدیل به شماره دانشجویی کنه اگه برام بنویسید ممنون میشم.
۱۳۹۹/۰۷/۰۹
form محمد
در:
سلام من میخواستم بدونم چه طوری میشه بدون اینکه از کاربر بپرسی که میخواهد از حساب خروج پیدا کند خود سایت بفهمد که کاربر از...
۱۳۹۹/۰۷/۰۹
form احمد
در:
با سلام ببخشید چطوری باید در جکوری از یک متغییر در صفحات دیگه استفاده کنم مثال دو عدد را باهم جمع کردم و ریختم داخل...
۱۳۹۹/۰۷/۰۹
form مهسا
در:
سلام و خسته نباشید مشکلی برای وبلاگ من پیش اومده موقع ورود بهم پیام میده وبلاگ داره بروز رسانی میشه و بعدا وارد وبلاگ شوید...
۱۳۹۹/۰۷/۰۸
form Moshtagh
در:
سلام و خسته نباشید بنده چند روزه که وقتی اطلاعات ورود به وبلاگم رو وارد تیترها و کلیک میکنم با چنین پاسخی مواجه میشم...
۱۳۹۹/۰۷/۰۸
form mahtab
در:
سلام خسته نباشین ببخشید چرا بلاگفا باز نمیکنه ؟؟؟ میرم مدیریت وبلاگ نه تو بروز شده ها وبی هستم نه هم که...
۱۳۹۹/۰۷/۰۷
form جواد
در:
سلام و عرض ادب. سایت من هک شده و یک کد ریدایرکت تو دیتابیس هاستم بارگزاری شده که آخر همه پست ها تو...
۱۳۹۹/۰۷/۰۷
  در انتظار بررسی: ۰
 پاسخگویی به سوالات ممکن است تا 24 ساعت زمان ببرد.