شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

تبدیل تاریخ میلادی، شمسی با مبدل 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>
پیش نمایش
دسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
ارسال پارامتر به URL و دریافت مقادیر با PHP
دریافت و نمایش پیج رنک گوگل با PHP
نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
نحوه نمایش متن و تصاویر اتفاقی در PHP و MySQL
ارسال ایمیل با PHP و کلاس PHPMailer
دیدگاه
more ۹۶ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
احسان
۱۳:۰۴ ۱۳۹۵/۰۳/۱۰
من نمایشش هم میخواستم .
از فریم ورگ runner استفاده میکنم
لطفا به سایت زیر مراجعه کنید، توضیحات کامل و مفصل است:
jdf.scr.ir
احسان
۱۲:۰۴ ۱۳۹۵/۰۳/۰۶
سلام دوست عزیز من از فریم ورک استفاده می کنم اما توی بخش تاریخ به مشکل برخوردم که کدی که شما گفتید رو میزنم اما فیلد خالی بر می گردونه اما وقتی از now استفاده میکنم به میلادی برمیگردونه اگر کمکم کنید ممنون میشم
این آموزش در خصوص نحوه تبدیل تاریخ میلادی به شمسی است نه صرفا نمایش تاریخ میلادی، ضمن اینکه استفاده از فریم ورک به خودی خود مشکلی در خصوص نمایش تاریخ با تابع date نخواهد بود، اگر مشکلتان صرفا استفاده از تابع date است، لطفا در وب در این خصوص جستجو نمائید در غیر اینصورت نیاز به ارائه اطلاعات بیشتری از فریم ورک، نحوه استفاده از کدها و خروجی مورد انتظار است!
جمال
۰۰:۲۷ ۱۳۹۵/۰۲/۱۲
سلام
من می خوام خروجی jdf در مورد شماره روزها به صورت عددی باشه در حالی که وقتی از دستور var_dump استفاده می شود به صورت string 4 نمایش داده میشه و اگر از توابع int , intval استفاده می کنم به int ولی با مقدار صفر تبدیل میکنه
برای تبدیل اعداد فارسی به انگلیسی می توانید از تابع زیر استفاده کنید:
function convertFaEn($str) {
$persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹');
$num = range(0, 9);
$result = str_replace($persian, $num, $str);
return $result;
}
مثال:
$jalali_date = intval(convertFaEn($jalali_date));
var_dump($jalali_date);
test
۱۳:۳۹ ۱۳۹۵/۰۲/۱۰
سلام
من میخوام مقدار تاریخ رو (1395/2/11 ) تبدیل به حروف کنم مثلا بگه یازدهم اردیبهشت هزار و سیصد و نود و پنج باید چی کار کنم؟
لطفا به جداول راهنمای لینک زیر مراجعه کنید، با جایگزینی پارامترها در تابع jdate به راحتی می توانید خروجی مورد نظر خود را داشته باشید:
http://jdf.scr.ir/rahnama/?t=jadvalha
نکته: تاریخ را ابتدا به میلادی (مطابق فرمت آموزش) تبدیل و سپس در تابع jdate استفاده کنید.
محمد صادقی
۱۳:۵۷ ۱۳۹۴/۱۲/۱۶
مرسی از جوابتون خیلی بنده را جلو انداختید واقعا شرمنده شما شدم عید تشریف بیارید یزد در خدمتتان باشیم
محمدصادقی
۰۹:۲۷ ۱۳۹۴/۱۲/۱۳
سلام مرسی از جوابتون از این برای تاریخ شمسی هم میشود استفاده کرد؟
بله، منتها ابتدا باید تاریخ شمسی را به فرمت استاندارد میلادی تبدیل کنید، در فایل JDF تابعی به نام jalali_to_gregorian وجود دارد، یک مثال:
$jalali_date = '1392/01/01';
list($year, $month, $day) = explode('/', $jalali_date);
$gregorian_date = jalali_to_gregorian($year, $month, $day);
list($year, $month, $day) = $gregorian_date;
echo $year.'-'.$month.'-'.$day;
که خروجی برابر است با
2013-3-21
از این تاریخ باید در روشی که در آموزش گفته شده (با کمک list و تابع mktime) استفاده کنید.
نکته: می توانید برای زمان مقادیر 00:00:00 را در نظر بگیرید.
محمد صادقی
۱۰:۲۰ ۱۳۹۴/۱۲/۱۰
سلام و خسته نباشید به دست اندکاران این سایت خوب و عالی
بنده گیر یه مشکل ساده افتاده ام اونم این هست که میخام کاربر تاریخ که وارد میکند برای روز گذشته نباشد هر کاری میکنم نمیشه خواهشا زود جواب بدید برای پروژه آخر ترم میخام
در صورت درک این آموزش و مطالعه سوالات و پاسخ های مطرح شده، به راحتی می توانید این کار را انجام دهید، در هر حال جهت راحتی کار می توانید از نمونه کد زیر استفاده نمائید:
<?php 
$current = strtotime(date("Y-m-d"));
$date = strtotime("2014-09-05");

$datediff = $date - $current;
$difference = floor($datediff/(60*60*24));
if ($difference == 0) {
echo 'Today';
} else if ($difference > 1) {
echo 'Future Date';
} else if ($difference > 0) {
echo 'Tomarrow';
} else if ($difference < -1) {
echo 'Long Back';
} else {
echo 'Yesterday';
}
?>
سحر
۱۲:۱۹ ۱۳۹۴/۱۱/۰۹
باسلام
من از این تابع استفاده میکنم و درست کار میکنه اما زمان نمایش آن بهم ریخته است.
عکس زیر گویای ماجراست:
http://s3.img7.ir/uvJBm.png
صرف نمایش تاریخ به صورت اشتباه کمکی به یافتن علت آن نمی کند! باید سورس کدها بررسی شوند، ممکن است پارامتری به اشتباه تنظیم شده باشد یا میزان اختلاف زمانی سرور صحیح نباشد، یا به فرض (معمولا در لوکال هاست) تاریخ سیستم عامل به نحو صحیح تنظیم نشده باشد!
امین
۱۹:۴۴ ۱۳۹۴/۱۱/۰۷
سلام استاد
تاریخ میلادی و قمری رو چطور میشه نمایش داد
مثلا میخوام بنویسه :
11 دسامبر 2015
8 رجب 1428
تا آنجا که اطلاع داریم با توجه به اینکه تقویم قمری مبتنی بر روئیت هلال ماه و از کشوری به کشور دیگر متغیر است، ایجاد تطبیق استاندارد به راحتی ممکن نیست و کلاس یا تابع بخصوصی برای آن سراغ نداریم!
در هر صورت می توانید عباراتی مانند "PHP Islamic Calendar" را در وب جستجو کنید، ممکن است به نتایجی برسید!
آرزو
۱۰:۴۴ ۱۳۹۴/۰۹/۲۸
سلام. بسیار ممنون از آموزش های خوبتون
من این کد و با توضیحات شما اجرا کردن. با این که ساعت سیستمم درسته ولی ساعت و حدود 4 ساعت جلوتر نشون میده ولی تاریخ درسته!
ساعت بر اساس اطلاعات و تنظیمات منطقه زمانی مفسر PHP نمایش داده می شود، لذا یا باید این منطقه زمانی را اصلاح کنید یا به ازای هر ساعت، معادل 3600 ثانیه (60 * 60، هر ساعت 60 دقیقه و هر دقیقه 60 ثانیه) به متغیر timezone که در نمونه کد وجود دارد، اضافه (یا کم) کنید!
محمد
۰۷:۴۵ ۱۳۹۴/۰۹/۱۹
سلام
من یکسری اطلاعات فروش در دیتابیس خود دارم و قصد دارم که اطلاعات فروش رو بر اساس تاریخ نمایش بدم .
فروش امروز ، دیروز ، هفته ، ماه جاری ، ماه قبل و فروش سال
برای این منظور خیلی راحت از توابع SQL استفاده کردم ، و اطلاعاتو از بانک گرفتم
اینم کد هام
public function getTotalSalesBytoday($day) {
$query = $this->db->query("SELECT SUM(total) AS total FROM `order` WHERE DATE(date_added) = NOW()");
return $query->row['total'];
}
public function getTotalSalesByYesterday($day) {
$query = $this->db->query("SELECT SUM(total) AS total FROM `order` WHERE DATE(date_added) = '".date('Y-m-d',strtotime('-1 days'))."'");
return $query->row['total'];
}
public function getTotalSalesByWeek($week) {
$query = $this->db->query("SELECT SUM(total) AS total FROM `order` WHERE WEEK(date_added) = WEEK(NOW()) AND YEAR(date_added) = YEAR(NOW())");
return $query->row['total'];
}
public function getTotalSalesByMonth($month) {
$query = $this->db->query("SELECT SUM(total) AS total FROM `order` WHERE MONTH(date_added) = MONTH(NOW()) AND YEAR(date_added) = YEAR(NOW())");
return $query->row['total'];
}
1- سوال اولم اینه که با توجه به نحوه کدنویسی فوق ، چجوری میتونم فروش ماه قبلو به دست بیارم .
2- سوال دوم و البته مشکل اصلیم ، توابع WEEK , MONTH از SQL بر اساس تاریخ میلادی کار می کنند به این معنی که روز اول هفته یک شنبه هست ، پس فروش هفته برای حالت شمسی اشتباهه و همچنین MONTH براساس ماه های میلادی هست ولی من فروشو بر اساس ماه شمسی می خوام ؛ همینطور برای فروش سال و ماه قبل
البته امروز و دیروز که مشکل نداره .
من میخوام ابتدا بدونم میشه پیشفرض های SQL تغییر داد ؟ که روز اول هفته شنبه باشه و روز اول ماهو چند روز به عقب بکشیم تا برابر ماه شمسی بشه ؟
اینجوری دیگه راحت میشه از این توابع استفاده کرد .
در این مورد سرچ کردم و یه چیزایی مثل این پیدا کردم ولی چون سایتم روی اینترنته تازمانی که مطمئن نشم نمیخوام استفاده کنم
http://www.sqlteam.com/article/returning-a-week-number-for-any-given-date-and-starting-fiscal-month
پیشنهاد شما چیه ؟ چه کار کنم تا به جواب مورد نظرم برسم منبع خوب هم اگه در این مورد دارید ، اگه لطف کنید ممنون میشم (انگلیسی هم بود مورد نداره)
تشکر
برای کار با تاریخ و زمان بسته به هدف و شرایط می توانید روش های مختلفی را استفاده کنید، اما تغییر پیش فرض MySQL به نظر روش ساده و مناسبی نیست!، به نظر ما یکی از ساده ترین روش ها این است که:
- تاریخ ها به صورت میلادی و با فرمت فرضی زیر در دیتابیس (در ستونی از نوع DATETIME) ثبت شوند:
2013-01-18 14:59:33
این فرمت جزء حالت های استاندارد MySQL است و لذا مشکلی به لحاظ استفاده از علامت های مقایسه ای مانند کوچکتر یا بزرگتر نخواهید داشت.
- در گام بعدی باید نحوه بدست آوردن تاریخ گذشته از روی تاریخ فعلی را بلد باشید که این کار با کسر زمان فعلی از میزان زمان (به ثانیه) تا روز گذشته در پارامتر timestamp تابع date قابل انجام است، به طور مثال برای روز گذشته:
<?php
$timezone = 3.5 * (60 * 60);//12600
$oneday = 24 * (60 * 60);//86400
$yesterday_date = date("Y-m-d H:i:s", time() - ($timezone + $oneday));
echo $yesterday_date;
?>
-اکنون در پرس و جوی خود می توانید مقایسه را انجام دهید، به فرض:
SELECT col FROM tbl WHERE date_col > $yesterday_date
برای محاسبه دقیق تر و جلوگیری از تداخل نتایج مربوط به امروز، می توانید تاریخ شروع امروز را به صورت زیر بدست بیاورید:
<?php
$timezone = 3.5 * (60 * 60);//12600
$today_date = date("Y-m-d 00:00:00", time() + ($timezone));
echo $today_date;
?>
و پرس و جوی کاملتری بنویسید:
SELECT col FROM tbl WHERE date_col > $yesterday_date AND date_col < $today_date
به این ترتیب فقط ردیف های مربوط به روز گذشته استخراج می شوند، همین فرمول برای هفته، ماه و سال نیز قابل اجرا است!
- اما برای بحث شروع روزها و... می توانید با توابع JDF به راحتی تاریخ میلادی را به عنوان آرگومان داده و معادل فارسی خروجی بگیرید، سپس این خروجی که می تواند روز (به صورت عددی، حروفی و...)، ماه و... باشد را با دستورات شرطی مطابق با نیاز خود بررسی کنید، به فرض اگر بخواهیم مطمئن شویم که امروز شنبه است:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>PHP Date Time</title>
</head>
<?php
function convert($string) {
$persian = array('۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹');
$num = range(0, 9);
$result = str_replace($persian, $num, $string);

return $result;
}
include('jdf/jdf.php');
$timezone = 3.5 * (60 * 60);//12600
$today_date = date("Y-m-d 00:00:00", time() + ($timezone));
//echo $today_date;
echo '<br>';
$array = explode(' ', $today_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("زمان: H:i:s - تاریخ: Y/m/d", $timestamp);
$jalali_date = jdate("w", $timestamp);
if(convert($jalali_date) == 0){
echo 'شنبه';
}
else{
echo $jalali_date;
}
?>
<body>
</body>
</html>
با مراجعه به سایت jdf.scr.ir می توانید لیست کاملی از توابع و آرگومان های قابل استفاده در آنها را جهت گرفتن خروجی مورد نظر مشاهده کنید، در صورتی که این نمونه کدها را درک کنید، تقریبا هر تاریخی را می توان با داشتن تاریخ و زمان فعلی بدست آورد و به شمسی برگرداند، در مورد ماه نیز همین رویه (با تغییر آرگومان های تابع jdate) قابل انجام است.
علی
۲۳:۰۸ ۱۳۹۴/۰۹/۱۵
سلام
من از موتور قالب اسمارتی استفاده میکنم تو این مثال که مربوط به بخش نظرات هستش چطوری باید اینو به شمسی تبدیل کنم
if($userinfo['allowcomment']){
header("Expires: Mon, 18 Jul 1988 01:08:08 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0

$smarty->assign('vvckey', CreateVVC());
$smarty->assign('comment', $comment);
}
که میشه این خط :
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
این کد اصلی هستش
function DisplayDate($timestamp, $dateformat = 'Y-m-d H:i:s')
{
global $mainsettings;

if(!strlen($dateformat))
{
$dateformat = $mainsettings['siteDateFormat'];
}

$timezoneoffset = ForceInt($mainsettings['siteTimezone']);

return $timestamp ? @gmdate($dateformat, $timestamp + (3600 * $timezoneoffset)) : '';
}
ممنون
با توجه به نوع دستور که header است، نباید تاریخ به صورت شمسی باشد، با این حال جهت اطلاع ابتدا باید تاریخی ترجیحا با این فرمت به میلادی در یک متغیر داشته باشید:
$datetime = '2013-01-18 20:00:29';
تفاوتی نمی کند که این تاریخ را از چه راهی به دست آورید، به طور مثال:
$datetime = gmdate("Y-m-d H:i:s");
نکته: می توانید از تابع DisplayDate هم خروجی مشابه دریافت کنید.
سپس از فاصله خالی بین تاریخ و زمان استفاده کرده و با تابع 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);
include ('jdf.php');
$jalali_date = jdate("زمان: H:i:s - تاریخ: Y/m/d",$timestamp);
echo $jalali_date;
هنر
۰۲:۲۷ ۱۳۹۴/۰۷/۲۳
خوب همه ی حرف های شما قبول
ولی کجای اون کدها مبهم بود براتون؟ اگه دقت کرده باشین اخر اخرش یه کد پیدا کرده بودم واسه راست چین کردنش من فقط میخواستم قبل اینکه متن بره واسه چاپ راست چین بشه فقط همین به هر حال دستت درد نکنه فقط یه چیزی الان من تو pdate به این صورت تاریخ رو شمسی کردم
 pdate("Y/n/d", $rs['adddate']);
حالا تو jdf به چه شکل باید انجامش بدم
اینو به من بگید تا یاد میگیرم دقیقا همین بالایی رو تبدیل کنید
- گفتیم، تابع watermark در کدهای شما استفاده شده که کار اصلی را انجام می دهد، اما خود این تابع در سورس کدها درج نشده و در جای دیگری از فایل های شما قرار دارد که بر ما مشخص نیست، به همین دلیل نمی توان کمک خاصی کرد!
- آموزش استفاده از تابع jdate در مطلب حاضر گفته شده، ضمن اینکه با مراجعه به سایت jdf.scr.ir هم می توانید اطلاعات کاملی از این تابع داشته باشید، منتها به نظر مشکل شما بیشتر به عدم آشنایی با مبحث تاریخ و زمان در PHP برمی گردد تا استفاده از این تابع، در واقع نمی توان انتظار داشت بدون آشنایی مقدماتی اولیه بتوان از توابع کاربردی ثانویه به راحتی استفاده کرد!
هنر
۲۰:۳۵ ۱۳۹۴/۰۷/۲۲
خوب یه مقاله خوندم در مورد و به این نتیجه رسیدم
کدم رو به این شکل همونطور که گفتین قبل از تابع استفاده کردم
<?php echo var_dump($client->fault); die('forced to die'); pdate("Y/n/d", $rs['adddate']); ?>
جواب خطا :
mmmmmm NULL forced to die
ام ام ام الان چیه اینجا!!!
درست یاد گرفتم؟
دوست گرامی خطایابی باید با هدف مشخص صورت گیرد، به عبارتی باید بدانید دنبال چه چیزی هستید، نه اینکه صرفا متغیرها را داخل دستورات قرار دهید! به طور مثال ابتدا باید ببینید آیا تابع pdate با یک مقدار ثابت (دستی) صحیح عمل می کند یا خیر، سپس باید ببینید چه مقادیری برای آرگومان به این تابع می دهید، به فرض در اینجا برای آرگومان دوم مقدار زیر تنظیم شده که مشخص نیست چه چیزی است؟!:
$rs['adddate']
باید این متغیر را با echo خروجی بگیرید و ببینید چه چیزی را به تابع می دهید! در کل توصیه می کنیم از JDF استفاده کنید چون پشتیبانی و راهنمایی خیلی بهتری نسبت به این تابعی دارد که اصرار به استفاده از آن دارید و تقریبا تمام نیازهای بحث تاریخ شمسی را پوشش می دهد، اگر استفاده از این تابع برایتان دشوار است، احتمالا مشکل در پائین بودن سطح آشنایی شما با مباحث مقدماتی است که باید برای خلاصی از مشکلات اینچنینی حتما مطالعه خود را در سطوح مقدماتی مخصوصا در بحث تاریخ و زمان در PHP بیشتر کنید، باور کنید از آخر شروع کردن بدون اینکه مقدمات را به دقت پشت سر بگذارید فقط کار خودتان و پاسخ دهی به سوالاتتان را سختتر می کند! مثال: در یکی از سوالات که در انجمن های مختلف پرسیده اید، از تابع watermark استفاده کرده اید، در صورتی که سورس خود تابع مشخص نیست و نمی توان از روی حدس و گمان فهمید که این تابع چه ساختاری دارد و چه قابلیت هایی به آن قابل اضافه شدن است!
با شرایط فعلی تنها راه عملی حل مشکلاتتان دسترسی به سورس کدها و تست آنلاین است!
هنر
۰۰:۰۱ ۱۳۹۴/۰۷/۲۲
من از تابع pdate استفاده میکنم
تو دیتابیسم تاریخ
2015-10-10
به این صورت ذخیره شده
وقتی از این تابع استفاده میکنم به این صورت در میاد
1348-10-10
چندین و چند جا سر زدم و گشتم چیزی در مورد عقب افتادن سال پیدا نکردم مشکل از چیه؟
متاسفانه این تابع را بررسی نکرده ایم، البته به نظر نمی رسد مشکل از تابع باشد، باید ببینید چه آرگیومنت هایی به تابع خود می دهید که این نتیجه را برمی گرداند، در کل برای حل مشکلات PHP نیازی به گشتن در سایت های مختلف به جزء در مواقع ضروری نیست، علت بسیاری از موارد از ایرادات بعضا جزئی کدنویسی و آرگیومنت دهی اشتباه در توابع است، این مشکل نیز با چند خطایابی ساده (echo گرفتن از متغیرها قبل از استفاده در تابع یا استفاده از var_dump، print_r و...) معمولا به راحتی قابل تشخیص است!
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
2 × 3
20 × 20
=