پروژهها
دستهبندیها
پیوندها
کلاس تاریخ جلالی برای php
چهارشنبه، ۱۴ اردیبهشت ۱۳۹۰
سالها بود برای تبدیل تاریخ میلادی به جلالی در پروژهها از تابع تاریخ شمسی که توسط دوست خوبم میلاد راستیان نوشته شده بود استفاده میکردم و این تابع با وجود قدیمی بودنش به خوبی از پس همه کارها بر میآمد. تا شب پیش که درحال کار کردن روی سیستمی بودم که نیاز به محاسبی زمانی برای سالهای بسیار دور داشت (مثلا ۱۰۰ سال آینده). با کمی تست متوجه شدم که تابع date که تابع پیشفرض پیاچپی برای تاریخ و زمان است، حداکثر تا سال ۲۰۳۸ میلادی قادر به محاسبه است. به همین دلیل تابع تاریخ شمسی قبلی که از آن استفاده میکردم، بخاطر اینکه بر اساس تابع date نوشته شده بود، قادر به محاسبه سالهای بیشتر از ۱۴۱۵ شمسی نبود. بعد از اینکه مطمئن شدم این تابع قابل تصحیح نیست، تصمیم گرفتم بر اساس امکان جدیدی که در PHP5 معرفی شده بود به نام DateTime، یک کلاس تاریخ جلالی بنویسم که امکاناتی که برای پروژه خودم مد نظر بود را داشته باشد. گفتنی است که کلاس DateTime در پیاچپی قادر است تا سال ۹۹۹۹ میلادی را محاسبه کند.
امکانات کلاس تاریخ جلالی (نسخه ۱.۵)
- قالب بندی زمان بر اساس تمام پارامتر های موجود در تابع date پیاچپی
- امکان فعال/غیرفعال کردن تبدیل تاریخ به جلالی
- امکان فعال/غیرفعال کردن تبدیل اعداد به فارسی
- امکان استفاده از مناطق زمانی تعریف شده در پیاچپی، برای مثال: Asia/Tehran
- امکان ساخت زمان از نوع Unix Timestamp یا Epoch Time
- نوشته شده به صورت شیگرا.
نحوه استفاده از کلاس تاریخ جلالی
برای استفاده از کلاس تاریخ جلالی (شمسی) ابتدا آن را از این آدرس بارگذاری کنید، در داخل فایل فشرده شما، یک فایل به نام jdatetime.class.php وجود دارد. آنرا در ساختار پوشهای پروژه خود قرار داده و از طریق دستور require_one فراخوانی کنید:
require_once dirname(__FILE__) . '/jdatetime.class.php';
برای شروع استفاده از این کلاس، باید یک شی از کلاس jDateTime بسازید. برای اینکار در جایی از برنامه خود خطوط زیر را فراخوانی کنید:
$date = new jDateTime(); //Creates a new instance
با اینکار شما به کلاس تاریخ جلالی از طریق شی $date دسترسی خواهید داشت. اما سازنده این کلاس سه پارامتر را به عنوان تنظیمات سیستم قبول میکند:
$date = new jDateTime(true, true, 'Asia/Tehran');
پارامتر اول، تعیین میکند که اعداد سیستم به فارسی تبدیل شوند یا نه. مثلا ۱۲۳۴ به ۱۲۳۴، این گزینه به صورت پیشفرض فعال است. برای غیر فعال کردن آن میتوانید این پارامتر را به false تغییر دهید.
پارامتر دوم تبدیل تاریخ به جلالی را تعیین میکند و به صورت پیشفرض فعال است. در صورتی که میخواهید از این کلاس برای تاریخ میلادی استفاده کنید، این پارامتر را false تعیین کنید. توجه کنید که اگر این گزینه را غیرفعال کنید، دیگر اعداد به فارسی تبدیل نمیشوند حتی اگر آن را فعال کرده باشید.
پارامتر سوم، منطقه زمانی است. در سیستم های یونیکس مثل لینوکس و مکینتاش، منطقه زمانی پیشفرض GMT (ساعت گرینویچ) و در سیستمهای ویندوز، منطقه زمانی پیشفرض، منطقه زمانی سیستم عامل انتخاب شده است. برای تعیین منطقه زمانی شما میتوانید یکی از مناطق زمانی را که پیاچپی قبول میکند به صورت متنی به کلاس ارسال کنید. برای مثال منطقه زمانی ایران Iran/Tehran و منطقه زمانی نیویورک America/New_York است. (لیستی از مناطق زمانی معتبر)
دقت کنید این پارامترها به عنوان پیشفرضهای سیستم در نظر گرفته میشوند و در طول اجرای برنامه معتبرند.
متد date
برای دریافت تاریخ میتوانید از متد date در این کلاس به این صورت استفاده کنید:
$date = new jDateTime(true, true, 'Asia/Tehran');
echo $date->date("l j F Y H:i");
دو پارامتر اول متد date دقیقا مانند تابع date پیاچپی است. پارامتر اول یک رشته قالب بندی، و پارامتر دوم زمان مورد نظر برای قالببندی بر اساس ثانیه از اول ژانویه ۱۹۷۰ (مبنای تاریخ برنامه نویسی یا Epoch Time). در صورتی که میخواهید تاریخ را بر اساس زمان کنونی محاسبه کنید، میتوانید متد date را بدون این پارامتر اجرا کنید و یا از تابع time() در پیاچپی استفاده کنید.
توجه کنید در صورتی که هنگام ایجاد شی از روی کلاس پارامترهای ورودی را تنظیم کرده باشید (که در بالا توضیح داده شد)، متد date بر اساس آنها عمل خواهد کرد. اما گاهی شما نیازدارید که به صورت موقت تنظیمات را تغییر دهید و نمیخواهید که این تنظیمات روی کل کلاس تاثیر داشته باشد. برای این منظورم، شما میتوانید سه پارامتر دلخواه را به متد date ارسال کنید:
$date->date("d-m-Y", time(), false, true, 'America/New_York');
پارامتر سوم، چهارم و پنجم، دقیقا مثل پارامترهایی که هنگام ساخت شی به کلاس ارسال کردید، عمل میکنند. پارامتر اول تبدیل اعداد، پارامتر دوم تاریخ جلالی و پارامتر سوم منطقه زمانی را تعیین میکنند. برای استفاده از مقادیر پیشفرض هرکدام از این پارامتر ها میتوانید به آنها null ارسال کنید.
برای مثال اگر منطقه زمانی را Asia/Tehran انتخاب کردهاید ولی میخواهید یک رشته تاریخ را بر اساس منطقه زمانی نیویورک چاپ کنید، میتوانید از دستور زیر استفاده کنید:
$date->date("d-m-Y", time(), null, null, 'America/New_York');
دستور بالا رشته قالب بندی شده بر اساس تنظیمات پیشفرض سیستم و منطقه زمانی نیویورک را برمیگرداند. در صورتی که دقیقا بعد از این دستور، مجددا متد date را اینبار بدون این پارامترها فراخوانی کنید، همه تنظیمات در حالت پیشفرض خواهند بود.
متد gDate
همچنین برای هرچه ساده تر شدن این فرآیند، در صورتی که میخواهید از تاریخ میلادی استفاده کنید و به هر دلیلی نمیخواهید یا نمیتوانید پارامتر های سوم و چهارم متد date را تنظیم نمایید، میتوانید از متد کمکی gDate استفاده کنید. پارامتر اول و دوم این متد همانند متد date است و پارامتر سوم آن منطقه زمانی است (دلخواه). این متد همواره تاریخ را به میلادی باز میگرداند:
$date->gDate("Y-m-d", time(), 'Asia/Tehran');
متد strftime
این متد مانند متد date تاریخ را به شکل دلخواه شما قالب بندی میکند، با این تفاوت که بجای حروف تعیین شده در دستور تابع date() پیاچپی، همانند تابع strftime() کار میکند. آرگومانهای ورودی این متد دقیقا مانند متد date میباشند. برای مشاهده لیست علائم پشتیبانی شده صفحه تابع strftime() در سایت پیاچپی را ببینید. مثال:
$date->strftime("%x %H", time(), false, true, 'America/New_York');
متد mktime
برای ساخت زمان بر اساس ثانیه میتوانید از متد mktime استفاده کنید:
$time = $date->mktime(0,0,0,10,2,1368);
پارامترهای ورود این متد دقیقا همانند پارامترهای تابع mktime() در پیاچپی هستند. به ترتیب: ساعت، دقیقه، ثانیه، ماه، روز، سال. خروجی این متد Unix Timestamp است که میتوانید آن را در متد date استفاده کنید. برای مثال برای نمایش خروجی مثال بالا:
$time = $date->mktime(0,0,0,10,2,1368);
echo $date->date("l j F Y", $time); //خروجی: شنبه ۲ دی ۱۳۶۸
متد mktime غیر از پارامترهای اصلی دو پارامتر اختیاری نیز دریافت میکند، پارامتر هفتم، که مشخص میکند تاریخ وارد شده در پارامترهای قبلی جلالی است یا خیر. به صورت پیشفرض این متد بر اساس تنظیمات اصلی کلاس عمل میکند. ولی گاهی وقتی تنظیمات اصلی جلالی است و شما میخواهید از همین متد برای تاریخ میلادی استفاده کنید، بدین منظور باید پارامتر هفتم را false ارسال نمایید:
$time = $date->mktime(0,0,0,12,23,2011, false);
برعکس این عمل نیز امکان پذیر است. برای مثال در تنظیمات اصلی کلاس پارامتر جلالی غیر فعال شدهاست، ولی شما میخواهید از متد mktime برای تاریخ جلالی استفاده کنید که در این حالت باید پارامتر هفتم true باشد.
پارامتر هشتم که کاملا دلخواه است پارامتر منطقه زمانی است. به صورت پیشفرض از تنظیمات اصلی کلاس استفاده میشود.
متد checkdate
از این متد برای اعتبارسنجی تاریخ جلالی یا میلادی میتوانید استفاده کنید. سه آرگومان اول این متد به ترتیب ماه، روز و سال به صورت عددی میباشند و آرگومان آخر نوع تاریخ (میلادی، یا جلالی) را تعیین میکند. اگر true را به عنوان ورودی چهارم ارسال کنید تاریخ جلالی، false تاریخ میلادی و در غیر اینصورت از تنظیمات اولیه کلاس که در بالا معرفی شد استفاده میشود. این متد صحت تاریخ ورودی را بررسی میکند. مثال:
$date->checkdate(10, 21, 1390); // Return true
$date->checkdate(9, 31, 1390); // Return false
دریافت کلاس تاریخ جلالی
این کد بر اساس لیسانس پیاچپی نسخه ۳.۰۱ منتشر میشود.
کاربران اجازه دارند از این کد در پروژههای شخصی و تجاری بدون محدودیت استفاده کنند، به شرط اینکه نام برنامه نویس «سالار کابلی» و دیگر کپیرایت های موجود در کد را به صورت دست نخورده در سورس کد باقی بگذارند.
توجه: برای استفاده از این کد باید نسخه پیاچپی نصب شده روی سرور شما ۵.۲ به بالا باشد.
سورسکد کلاس تاریخ/زمان جلالی (شمسی) را به صورت یک فایل فشرده با پسوند tar.gz. یا با پسوند zip. دریافت کنید.
کلاس تاریخ جلالی در GitHub منتشر میشود، میتوانید در این پروژه کدباز مشارکت کنید. (صفحه گیت هاب)
بدرود، سالار کابلی
ديدگاهها ۳۲ ديدگاه
-
صالح:
سلام سالار عزیز. ممنون از کار خوبت
اما دو نکته ۱ :
تاریخ شمسی در پی اج ۵٫۳ اضافه شده مطلبش رو هم در وبلاگ امید متقی به آدرس زیر میتوانید بینید. http://oxygenws.com/blog/archives/72-..-..htmlاما مورد دوم از شما برنامه نویسی ایرانی درخواست میکنم ایم فبیل پروژه های آزاد رو در گیت هاب انتشار بدید. تا قابلیت توسعه صحیج رو برای بقیه ایجاد کرده باشید. و حقوق خودتون هم رعایت بشه
۱۶ اردیبهشت ۱۳۹۰ - ۶:۱۷ ب.ظ -
سالار کابلی:
ممنون صالح عزیز.
من از وجود قابلیت تاریخ شمسی در PHP5.3 اطلاع داشتم، حتی خیلی متدهای مفید هم میتونستم به این کلاس اضافه کنم اگر میخواستم از PHP5.3 استفاده کنم، اما حقیقت اینه که الان بسیاری از سرورهای Shared از PHP5.2 استفاده میکنن و هنوز هم میترسن از اینکه PHP5.3 رو نصب کنن و البته حق هم دارن. سیستم های فاجعهای مثل جوملا نمیتونن خودشون رو سازگار کنن.در مورد گیت هاب هم درست میفرمایید، من از روز اول که این کد رو نوشتم روی گیت هاب منتشرش کردم اگر دقت کرده باشید لینک دانلود ها از گیت هاب هست و من تا الان حدود ۱۵ بار کلاس رو آپدیت کردم.
http://github.com/sallar/jDateTimeبدرود
۱۷ اردیبهشت ۱۳۹۰ - ۴:۴۱ ق.ظ -
مرتضی:
سلام
۲۱ اردیبهشت ۱۳۹۰ - ۱۰:۵۹ ق.ظ
یه سوالی داشتم می خواستم بدونم برای تبدیل TimeStamp میلادی به شمسی از چه تابعی استفاده کنم؟
تو دیتابیسم مثلا Timestamp به این صورته : ۲۰۱۱-۰۵-۱۱ ۰۱:۰۸:۱۱ -
سالار کابلی:
مرتضی عزیز، برای اینکار میتونید از تابع UNIX_TIMESTAMP در MySQL استفاده کنید. به این صورت:
۲۳ اردیبهشت ۱۳۹۰ - ۲:۳۸ ب.ظ
SELECT UNIX_TIMESTAMP(`date`) FROM tbl
بدرود -
baravak:
سلام سالار ممنونم، قبلا تعریف کارهات رو از مینایی شنیده بودم
۲۲ اردیبهشت ۱۳۹۰ - ۱۰:۰۷ ق.ظ
چه خوب میشد که اگه این کار رو برعکس هم می تونستیم استفاده کنیم
یعنی تبدیل شمسی به میلادی -
سالار کابلی:
سلام، ممنون
۲۳ اردیبهشت ۱۳۹۰ - ۲:۳۹ ب.ظ
برای انجام اینکار توی همین کلاس یه متد تعبیه شده که تاریخ شمسی رو به میلادی تبدیل میکنه. jDateTime::toGregorian -
MohammadReza:
با سلام و خشته نباشید- بنده می خواستم یه نگاهی به این کد تاریخ بندازید و ببینید می شه شمسی کنید این کد رو.اگه بشه که خیلی ممنون می شم و لطف بزرگی کردید…
http://s1.picofile.com/file/6903757542/calendar_class.zip.html
این کد تاریخ سیستم jcore هستش و یه سوال دیگه هم دارم اینکه چطوری فایل css بایدا راست چین بشه؟ آموزش جامعی هست؟ خودتون بلدید؟خلاصه یه دنیا امید و آرزو پشت این کد خوابیده :D
۱۳ تیر ۱۳۹۰ - ۲:۰۱ ب.ظ -
حمید:
لطفا توضیح دهید که با این کلاس میشود تاریخ های یک CMS را شمسی کرد یا نه؟؟؟
میخواهم مثلا تاریخ های vivvo را شمسی کنم.
۱۵ تیر ۱۳۹۰ - ۶:۰۳ ب.ظ -
sahar:
واقعا ممنون. کارتون خیلی عالی بود.همیشه موفق باشید
۱۴ مرداد ۱۳۹۰ - ۴:۳۱ ب.ظ -
جانان:
سلام!من یه سایت دارم آماده میکنم.فایل تقویمتون دانلود کردم و توی پروژ ام کپی کردم ولی
۲۲ مرداد ۱۳۹۰ - ۱۱:۵۵ ق.ظ
بعدش نمیدونم اصلا دستوراتی که گفتین کجا بنویسم ، میشه یکم راهنماییم کنین؟ -
سالار کابلی:
@جانان
۰۲ شهریور ۱۳۹۰ - ۹:۲۲ ب.ظ
طبق راهنمای بالا، بالای فایلتون، یه شی از کلاس jDateTime بسازید، و هرجایی که نیاز دارید (طبق ادامه راهنما) ازش استفاده کنید. -
میلاد صفاجوی:
سالار جان خیلی سالاری
۰۹ شهریور ۱۳۹۰ - ۵:۵۲ ب.ظ
سیستمی واسه جاوااسکریپت نداری؟
اینا php بودن واسه همین من نمی تونم تو بعضی از مدیریت محتوا ها ازشون استفاده کنم. اگه بخوام این تابع رو به جاوا اسکریپت در بیارم باید چیکار کنم؟ -
سالار کابلی:
قربانت میلاد عزیز.
۱۷ شهریور ۱۳۹۰ - ۱:۱۱ ق.ظ
نه متاسفانه کدی که من نوشتم فقط برای php هست، ولی اگر سرچ بکنی توی اینترنت میتونی کد تاریخ جلالی رو برای جاواسکریپت پیدا کنی. -
نوید:
کار تو حرف نداره! مثل همیشه تکی پسر.
۱۹ شهریور ۱۳۹۰ - ۵:۲۴ ب.ظ -
نوید:
ممنون سالار جان
۱۵ مهر ۱۳۹۰ - ۱۱:۵۰ ب.ظ
تو قالبهای اسمارتی چجوری میشه تاریخ رو به شمسی نشون داد؟ -
احمدینا:
ممنون از شما مفید بود
۲۷ مهر ۱۳۹۰ - ۱۰:۲۴ ب.ظ -
یه دوست:
سلام سالار عزیز
۰۶ آبان ۱۳۹۰ - ۱:۵۵ ق.ظ
رفتی تهران که اینجور بی سوادهای ندون دور ورت بپلکن.راستی زیاد به اینا افتخار میکنی.
قربانت -
مصطفی:
سلام. عالی بود. فقط میخواستم بدونم اگه بخوام تو تاریخی که نمایش میده ، ثانیه رو هم بخوام نشون بده باید چی وارد کنم؟ چون هر چی مثال زدید تو اون فایل تو هیچ کدومشون ثانیه رو نشون نمیده! ممنون میشم راهنمایی کنید. موفق باشید
۱۳ آذر ۱۳۹۰ - ۱:۰۸ ق.ظ -
دانیال:
متاسفانه این کد تاریخ امروز که ۱۳۹۰/۰۹/۲۰ هست رو جمعه ۲۰ آبان نشون میده . یعنی یک ماه اختلاف زمان وجود داره ؟!..
۲۰ آذر ۱۳۹۰ - ۲:۵۵ ب.ظ
چطور میشه این مشکل رو بر طرف کرد . ممنون میشم اگر اطلاع رسانی کنید . در ضمن اگر نحوه نمایش جز به جز زمان و تاریخ رو هم بعنوان نمونه در یک فایل قرار بدید که بدونیم چطور میشه ساعت و تاریخ و همچنین قبل از ظهر و بعد ازظهر و .. استفاده کنیم بسیار عالی میشه .
سپاس -
reza:
با سلام و تشکر از کار مفیدتون می خواستم نحوه تبدیل تاریخ میلادی به شمسی رو اگه ممکنه توضیح دهید تو فایل مثال هم نتونستم نحوه تبدیل رو ببینم
۲۷ آذر ۱۳۹۰ - ۱۲:۳۰ ب.ظ
باتشکر : رضا -
آرش همت:
سلام سالار، ممنون از این کلاست، هر از گاهی یکی باید بیاد این کد قدیمی تبدیل رو بروز بکنه و مرتبش کنه، کدی که نوشتی نسبتا تمیزه و از کد قدیمی بهتره یه چنتا پیشنهاد دارم برات که اگر بتونی انجامش بدی خیلی خوب میشه:
۱۷ دی ۱۳۹۰ - ۲:۰۲ ق.ظ
۱. فکر کنم انقدر php بلدی که کلاست رو طوری بنویسی که اگر کاربر php 5.3 و intl رو داشت از اون استفاده کنه (۱۷ برابر سریعتره!)
۲. یه نگاهی به کد این بابا هم بنداز: https://github.com/amsa/Shamsi-Date/blob/master/Date.php
۳. اسمش رو persian date بذاری خیلی بهتر میشه! جلال پادشاهی بود که این تاریخ رو کرد تاریخ رسمی که کار خاصی نبود خیام و بروبچ قدیم خیلی بیشتر رو این کار کردن.
۴. اگر حوصله داشتی یه تنظیم بذار که بشه ماهها رو به اسم افغانیشون هم نشون بدی -
سالار کابلی:
سلام آرش جان!
۱۷ دی ۱۳۹۰ - ۱۱:۰۴ ب.ظ
ممنون رفیق. لطف داری.
من بخاطر Compatibility نرفتم سراغ اون کلاس ولی این پیشنهادت که «اگر» ۵.۳ به بالا بود ازون استفاده کنه خیلی خوبه. ممنون. مینویسمش و حتمن عملیش میکنم.
اسم های افغانی و Persian Date هم یادداشت کردم دوست من.
ممنون. -
حمید:
دوست عزیر کارت خیلی عالیه اما چند تا مشکل وجود داره
این توابع باید مجدد بازنویسی بشه می تونید مجدد راهنمایی کنید؟
خواستم جایی استفاده کنم موفق نشدم مشکل عدم تعریف بعضی توابع استDateTime::add
۰۴ بهمن ۱۳۹۰ - ۶:۴۹ ب.ظ
DateTime::createFromFormat
DateTime::diff
DateTime::format
DateTime::getLastErrors
DateTime::getOffset
DateTime::getTimestamp
DateTime::getTimezone
DateTime::modify
DateTime::__set_state
DateTime::setDate
DateTime::setISODate
DateTime::setTime
DateTime::setTimestamp
DateTime::setTimezone
DateTime::sub
DateTime::__wakeup -
حمید:
در حقیقت منظورم توابع
۰۴ بهمن ۱۳۹۰ - ۶:۵۲ ب.ظ
jDateTime::add
jDateTime::createFromFormat
jDateTime::diff
jDateTime::format
jDateTime::getLastErrors
jDateTime::getOffset
jDateTime::getTimestamp
jDateTime::getTimezone
jDateTime::modify
jDateTime::__set_state
jDateTime::setDate
jDateTime::setISODate
jDateTime::setTime
jDateTime::setTimestamp
jDateTime::setTimezone
jDateTime::sub
jDateTime::__wakeup
هستش -
حمید:
کسی نبود به ما کمک کنه!!!!!!!!!!!!
۱۱ بهمن ۱۳۹۰ - ۶:۱۵ ب.ظ
ممنون میشم راهنمایی کنید -
سامان:
مرسی سالار جان.
۰۱ اردیبهشت ۱۳۹۱ - ۸:۵۳ ق.ظ
میخوام الان ازش استفاده کنم.
هیچی بهتر از تاریخ تولد آدم نمیشه :دی -
سامان:
سالار جان. یه جا از Iran/Tehran نام بردی. فک کنم Asia/Tehran باید درست باشه.
مرسی. موفق باشی.
۰۳ اردیبهشت ۱۳۹۱ - ۱:۰۴ ب.ظ -
پژمان:
سلام دوستان عزیز
۱۲ اردیبهشت ۱۳۹۱ - ۶:۰۸ ب.ظ
کسی میتونه بگه آیا میشه از این تاریخ در phpFox هم استفاده کرد؟
اگه آره راهنمایی کنید. -
میلاد ریحانی:
خیلی ممنون از انتشار این کلاس.
فقط یک چیز که اگر اضافه بشه بهتر امکان اینکه تاریخ و ساعت جدا از هم تبدیل بشن.
چون من در حال توسعه یه سیستم هستم که رو سرور لوکال اجرا میشه و اون سرور ساعتش ساعت رسمی ایران و هنگام استفاده از کلاس شما ۳:۳۰ ازش کم میشه که نباید بشه.ضمنا من این رو برای فریمورک FuelPHP ، به صورت یک پکیج در آوردم که بزودی در git میزارم.
۲۵ اردیبهشت ۱۳۹۱ - ۱۱:۲۵ ب.ظ -
میلاد ریحانی:
ببخشید که دوباره مزاحم میشم.منتها یه سوال جدید برام پیش اومد.
۲۶ اردیبهشت ۱۳۹۱ - ۱:۳۵ ق.ظ
فرض کنید شما همه رکورد های اردیبهشت رو می خواین کوئری بگیرین.
اول تو MySql از TIMESTAMP استفاده می کنین یا DATETIME؟
دوم چطور ۱ ماه رو به تاریخ شمسی اضافه می کنید؟
ثبت ديدگاه