تقویم شمسی در PHP

در این آموزش قصد داریم تا ضمن آشنایی با کتابخانه فارسی jdf، نحوه ی تبدیل تاریخ میلادی به تاریخ هجری شمسی را به کمک این کتابخانه یاد بگیریم و همچنین نحوه ی تنظیم “موقعیت زمانی” برای نمایش صحیح زمان  در PHP را آموزش ببینیم تا بتوانیم ساعت محلی “ایران” را به راحتی و بدون محاسبه اختلاف زمانی با GMT بدست آوریم.

[divider]

تاریخ شمسی در PHP

برای اینکار باید از کتابخانه jdf استفاده کنیم. این کتابخانه حاوی توابع بسیار مفید برای تبدیل تاریخ میلادی به شمسی و بالعکس می باشد. برای دریافت فایل این کتابخانه بصورت رایگان، می توانید به وب سایت سازنده ی آن به آدرس http://jdf.scr.ir مراجعه کنید. به همراه فایل کتابخانه jdf.php راهنمای توابع و نحوه ی استفاده از آنها به همراه مثال های کاربردی بیان شده است. با داشتن فایل jdf.php  و فراخوانی آن در برنامه های خود، می توانید از تاریخ شمسی به جای تاریخ میلادی استفاده کنید. به عنوان مثال فرض کنید بخواهیم تاریخ کنونی را بصورت “امروز جمعه ۲۰ تیر ۱۳۹۳” نمایش دهیم. برای بدست آوردن زمان تابعی به نام jdate داریم که معادل تابع date در php می باشد، با این تفاوت که خروجی آن تاریخ شمسی است. به نمونه کد زیر دقت کنید:


<?php
include_once('jdf.php');
$out=jdate('l j F Y');
echo "امروز".$out;
?>

خروجی این کد بصورت زیر خواهد بود:

امروز جمعه ۲۰ تیر ۱۳۹۳

[divider]

موقعیت زمانی ایران

همانطور که می دانیم اختلاف زمانی ساعت ایران نسبت به GMT برابر با ۳:۳۰+ است. به این معنا که اگر به ساعت گرینویچ که مبنای زمانی است، مقدار ۳:۳۰ اضافه کنیم، ساعت محلی ایران به دست می آید. مشکل دیگر این است که برخلاف آنچه که به نظر می رسد، تابع time بطور مستقیم برای بدست آوردن  زمان استفاده نمی شود. در واقع خروجی تابع time یک عدد صحیح بزرگ است که تعداد ثانیه های گذشته از تاریخ آغاز فعالیت یونیکس(یکم ژانویه ۱۹۷۰) را برمی گرداند. این عدد تحت عنوان timestamp شناخته می شود. برای ساخت تاریخ می توانیم از این عدد کمک بگیریم. به بیان ساده تر، برای بدست آوردن زمان نیز باید از تابع date کمک بگیریم. حالا اگر بخواهیم زمان را ازاین تابع بدست بیاوریم، کافیست که ساعت، دقیقه و ثانیه را به کمک “قالب بندی” مناسب از این تابع استخراج کنیم.  معمولا از قالب “h:i:s” برای بدست آوردن ساعت استفاده می شود. در این قالب بندی h بیانگر ساعت، i برای نمایش دقیقه و s برای ثانیه بکار رفته است:


date("h:i:s");

خروجی تابع date با این قالب بندی بصورت زیر خواهد بود:


۵:۰۹:۳۳

حالا برای اینکه از نمایش صحیح زمان و در نظر گرفتن اختلاف زمانی ایران اطمینان حاصل کنیم، تنظیمات پیشفرض موقعیت زمانی را به موقعیت زمانی “ایران” تغییر می دهیم:


<?php
date_default_timezone_set("Iran");
echo date("h:i:s");
?>

خروجی این کد بصورت زیر خواهد بود:


۰۵:۱۴:۲۲

حالا اگر بخواهیم که اعداد نشان دهنده زمان نیز اعداد فارسی(غیر لاتین) باشند و در تمام سیستم ها صحیح نمایش داده شوند، می توانیم از تابع jdate که در کتابخانه jdf وجود دارد استفاده کنیم:


<?php
date_default_timezone_set("Iran");
include_once('../date/jdf.php');
echo jdate("h:i:s");
?>

خروجی این کد بصورت زیر خواهد بود:


۰۵:۱۴:۲۲

[divider]

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

برای تبدیل تاریخ میلادی به شمسی یک تابع در این کتابخانه وجود دارد که ساختار آن به شرح زیر است:


gregorian_to_jalali($g_y,$g_m,$g_d,$mod);

در تابع بالا پارامتر $g_y سال میلادی(۴ رقمی)،

پارامتر $g_m ماه میلادی(۱-۱۲)،

پارامتر $g_d روز میلادی است(۱-۳۱)

پارامتر آخر که با نام $mod معرفی شده است، در صورتی که خالی باشد یا مقدار ” داشته باشد، خروجی تابع را بصورت آرایه‌ای از سال، ماه و روز شمسی تبدیل خواهد کرد و اگر مقداری در آن قرار دهیم، برای مثال ‘/’ خروجی تابع بصورت ‘۱۳۹۷-۱۲-۷’ خواهد شد. در واقع $mod تعیین کننده کاراکتری است که مابین اعداد سال و ماه و روز فاصله‌گذاری میکند. به مثال زیر توجه کنید:


gregorian_to_jalali(2011,2,11);// خروجی: array(1389,11,22);

gregorian_to_jalali(2011,2,11,' / ');// خروجی: ۱۳۸۹ / ۱۱ / ۲۲

[divider]

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

همانند توضیحی که در مورد تبدیل تاریخ میلادی به شمسی داده شد، برای تبدیل تاریخ شمسی به میلادی نیز تابعی به نام jalali_to_gregorian در این کتابخانه تعبیه شده است. با این تفاوت که ورودی‌های این تابع سال، ماه و روز شمسی هستند. به نمونه کد زیر دقت کنید:


jalali_to_gregorian(1389,11,22);// خروجی: array(2011,2,11);

jalali_to_gregorian(1389,11,22,' - ');// خروجی: ۲۰۱۱ - ۲ - ۱۱

موفق و پیروز باشید…

3 دیدگاه دربارهٔ «تقویم شمسی در PHP;

  1. سلام یه سوال داشتم اگه بخوام با این کتابخونه کل روزهای ماه جاری رو نشون بده چطوریه؟

    1. معمولا کتابخانه های شمسیاین امکان رو ندارن که بشه کل روزهای ماه جاری رو نشون داد.
      برای حل این مشکل باید خودتون دست به کار بشید و کدی بنویسید که این کار رو انجام بده.
      روال کار اینطوریه که اول تاریخ میلادی امروز رو به شمسی تبدیل می کنید و بعد در حالت شمسی عدد روز رو به ۱ تغییر میدین. اینطوری اول ماه رو پیدا میکنین. برای انتهای ماه یه درد سر وجود داره و اونم یکسان نبودن طول ماه هاست… شش ماه اول سال ۳۱ روزه اند و ۵ ماه بعد ۳۰ روزه… اسفند هم در سال های کبیسه ۳۰ روزه و در باقی سال ها ۲۹ روزه است.
      اگر واقعا این قابلیت رو نیاز دارید پیشنهاد میکنم از کتابخانه opilo/farsi استفاده کنید. این کتابخانه طول ماه رو بصورت خودکار محاسبه میکنه.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *