Quantcast استفاده از تاریخ شمسی و جلالی در php
شنبه, 09 مرداد 1389
   
Text Size

مرکز افزونه ها و امکانات اضافی جومفا

مرکز افزونه ها و امکانات اضافی جومفا بخشی است که افزونه های مفید و فارسی افزوده و مدیریت می شود.

این بخش یکی از بخش های بسیار مفید و پرمخاطب جومفا می باشد که کاربران نیز در این بخش با فارسی سازی و ارسال افزونه ها می توانند در این بخش مشارکت کنند.

جهت ورود به این بخش بر روی این متن کلیک نمایید.

مقالات ،آموزش ها و ویکی جومفا

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

این بخش می تواند مرجع کامل و قدرتمندی در زمینه ی گسترش و کمک رسانی جامعه ی جوملایی بشمار آید.

جهت ورود به این بخش بر روی این متن کلیک نمایید.

انجمن رفع اشکال جومفا

انجمن رفع اشکال مرکزی جهت پاسخگویی به مشکلات و سوالات کاربران عزیز بصورت آنلاین می باشد.

این مرکز توسط سرپرستان انجمن جومفا مدیریت و قطب اصلی این مرکز کاربران می باشند که به سوالات کاربران دیگر پاسخ می دهند.

جهت ورود به این بخش، بر روی این متن کلیک نمایید.

استفاده از تاریخ شمسی و جلالی در php

ابتدا از همه عزیزان به دلیل خوب نبودن و درست نبودن دستور زبان فارسی در مقالاتم پوزش می طلبم و امیدوارم من رو ببخشید و در صورت تمایل ویراستاری رو ارسال کنید تا قابل فهمتر شود.

یکی از بیشترین سوالات مربوط به بومی سازی و فارسی سازی یک اسکریپت یا یک برنامه در php ، تبدیل تاریخ میلادی به شمسی و بالعکس است که در طول چند سالی که تدریس می کنم ، تا بدین لحظه کسی نبوده که این مبحث براش مهم نبوده باشه و نیاز پیدا نکرده باشه.


از آنجایی که در حال تکمیل کتاب php6 در این لحظه می باشم( این کتاب نیاز به ویراستاری صد در صدی دارد) ، به این مبحث( بحث تاریخ میلادی و شمسی) رسیدم که در هیچ کتاب دیگری تا بدین روز مطالعه کردم ، ندیدم که توضیح کامل داده شده باشه.برای همین هم لازم دونستم این مبحث رو که بسیار مفید و لازمه هر برنامه نویس php می باشد را در جومفا قرار بدم تا عزیزان بتونند استفاده کنند.

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

حالا به اصل مطلب برسیم که همه رو تشنه نگه داشتیم و فقط تبلیغات کردیم Wink

این مقاله نیز با استفاده از دستورات php5 نوشته شده است.

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

عزیزانی در ایران همچون گروه iranphp.org  ( با مدیریت وحید سهرابلو  و علی مخلصی عزیز ) وجود دارند که بسرعت در حال پیشرفت و توسعه هستند و یکی از این الگوریتم های تاریخ شمسی رو به php تبدیل کردند و کار برنامه نویسان عزیز رو راحت کردند.استفاده از این برنامه بسیار راحت است.چون شی گرایی هم کار نشده و از توابع استفاده شده و کاربرانی که از شی گرایی می ترسند ،‌نگران نخواهند بود.البته ما در کتاب چند نوع برنامه شی گرایی برای تاریخ رو هم آماده کردیم که اگر عزیزان درخواست بدند ، اونها رو هم قرار میدم در جومفا.

جهت دریافت فایل برنامه نوشته شده توسط گروه iranphp.org بر روی این متن کلیک نمایید.

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

جهت ورود به وبلاگ ، کلیک نمایید.

مثلا فرض می کنیم تاریخ امروز به میلادی برابر است با


2010-02-14




این تاریخ رو ما در متغیر قرار میدهیم و همچون زیر خواهد شد.

$miladijoomfa="2010-02-14";

حالا باید با استفاده از تابع preg_split ، روز ،ماه و سال رو هم از جدا کنیم تا هر کدوم رو برنامه جدا جدا تبدیل کنه و سپس با استفاده از متغیر list ، مقادیر رو داخل متغیر های جدا قرار میدهیم.( چون تابع preg_split مقدار  خروجی را بصورت آرایه ای به ما خواهد داد ، اینکار رو می کنیم).آرگومنت اولی رو باید کاراکتری که سال و روز و ماه رو از هم جدا نشان میدهد رو قرار بدیم.در آرگومنت دوم هم متغیری که مقدار تاریخ میلادی درش قرار دارد.

list( $gyear, $gmonth, $gday ) = preg_split ( '/-/', $miladijoomfa );

سپس با استفاده از تابعی که برنامه ی شمسی موجود است با نام gregorian_to_jalali ، مقادیر سال و ماه و روز رو که هر کدام رو در متغیر جدا قرار دادیم رو به ورودی این تابع میدیم تا بتونه تبدیلات رو انجام بده.اما از آنجایی که خروجی این تابع نیز بصورت آرایه خواهد بود ،پس با استفاده از list ، مقدار شمسی شده رو داخل متغیر های جدید قرار میدهیم.

list( $jyear, $jmonth, $jday ) = gregorian_to_jalali($gyear, $gmonth, $gday);

سپس این مقادیر رو بصورت رشته ای در داخل متغیر قرار میدهیم و چاپ می کنیم.

$shamsijoomfa = $jyear."/".$jmonth."/".$jday;

echo $shamsijoomfa;

خوب.نتیجه ی برنامه ی ما خواهد بود :

1388/11/25

جهت تبدیل تاریخ شمسی به میلادی هم می تونید به این شکل عمل کنید ، با این تفاوت که بایستی بجای تابع gregorian_to_jalali از تابع jalali_to_gregorian استفاده کنید.


مثال :

// Shamsi to miladi date . www.joomfa.org.

$shamsijoomfa="1388-12-09";
list( $jyear, $jmonth, $jday ) = preg_split ( '/-/', $shamsijoomfa );

list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, $jday);

$miladijoomfa = $gyear."/".$gmonth."/".$gday;

echo $miladijoomfa;

نتیجه نیز برابر با 2010/2/28 خواهد بود.


حالا یک نکته مهم به عزیزان تازه برنامه نویس گلم بگم که تجربه و علم چی گفته.گفته که سعی شود در برنامه ها ، همیشه موقع ذخیره کردن ، تاریخ میلادی باشد.مثل ذخیره در فایل یا بانک اطلاعاتی.اما تنها هنگام نمایش ، شمسی شود.چون تاریخ میلادی استاندارد است و تاریخ شمسی فقط تاریخ بومی ما خواهد بود.استاندارد در php,mysql و ... همیشه تاریخ میلادی خواهد بود.البته میگید نه ، خوب تست کنید.سپس به مشکلاتش پی می برید.البته بعضی ها تا سرشون به سنگی نخوره درست نمی شند و حتما باید یک چیزی رو امتحان کنند.مثل خود من.


چند تا توضیح دیگه هم بدم و دیگه سرتون رو بدرد نیارم.یکسری تابع دیگه هم در این فایلی که توسط دوست عزیزم نوشته شده است ، موجود است که در برنامه هاتون می تونید استفاده کنید.


pdate: دقیقا مانند تابع date عمل می کند با این تفاوت که تاریخ های را به صورت شمسی باز می گرداند

pstrftime: دقیقا مانند تابع strftime عمل می کند با این تفاوت که تاریغ شمسی را باز می گرداند

DayOfYear: تعداد روزهای گذشته شده از سال را باز می گرداند. این تابع سه پارامتر سال و ماه و روز شمسی را دریافت می کند

isKabise: بررسی می کند که آیا سال شمسی که به آن می دهیم کبیسه است یا خیر در صورت کبیسه بودن مقدار درست در غیر این صورت مقدار غلط را باز می گرداند

pmktime: مشابه تابع mktime عمل می کند با این تفاوت که روز و ماه و سال را به صورت شمسی دریافت می کند

pcheckdate: مانند تابع checkdate عمل می کند با این تفاوت که ماه و سال و روز شمسی را دریافت می کند

pgetdate: مانند تابع getdate عمل می کند با این تفاوت که تاریخ شمسی را باز می گرداند



موفق و پیروز و همیشه سربلند باشید.


نویسنده : مصطفی علوی نیک.




در ادامه نیز الگورتیم تاریخ شمسی که در وب سایت تبیان نوشته شده است رو قرار میدهم.


براي تبديل تاريخ شمسي به ميلادي و برعکس بايد تعداد روزهاي سپري شده از ابتداي هر کدام از اين تاريخ‌ها را از مبدا خود به دست بياوريم. اگر مي‌خواهيم تاريخ شمسي را به ميلادي تبديل کنيم ابتدا بايد روزهاي سپري شده از مبدا تاريخ شمسي تا کنون را حساب کنيم و آن را به اضافه‌‌ي 226899 بکنيم. عدد به دست آمده تعداد روزهاي گذشته از ابتداي تاريخ ميلادي تا کنون است و با استفاده از آن مي‌توانيم تاريخ ميلادي را حساب کنيم. براي تبديل تاريخ ميلادي به شمسي همين کار را بايد برعکس انجام بدهيم و عدد 226899 را بايد از تعداد روزهاي تاريخ ميلادي کم بکنيم و در اين قسمت عدد به دست آمده تاريخ شمسي است.
همين روش نيز براي تبديل تاريخ قمري به شمسي و برعکس نيز قابل استفاده است. ولي در اين مورد ديگر عددي که بايد اضافه يا کم بشود 226899 نيست.
شايد از خود بپرسيد که عدد 226899 را از کجا به دست آورده‌‌ام. براي به دست آوردن اين عدد بايد تاريخ شمسي و ميلادي يک روز را در اختيار داشته باشيد. به عنوان مثال 13/4/1383 شمسي طبق تقويم برابر 3/7/2004 ميلادي است. کاري که بايد الا بکنيم اين است که اين دو تاريخ را به روز تبديل کنيم و در اين تبديل بايد تعداد سال‌هاي کبيسه‌اي که اين دو تاريخ پشت سر گذاشته‌اند نيز فراموش نکنيم. براي اينکه تعداد سال‌هاي کبيسه را در دو تقويم ميلادي و شمسي بخواهيم محاسبه کنيم بايد 1382 را براي تقويم شمسي و 2003 را براي تقويم ميلادي تقسيم بر 4 کنيم. خارخ قسمت اين دو تقسيم به ترتيب تعداد سال‌هاي کبيسه‌ي تقويم شمسي و ميلادي است که از ابتداي شروع به کار اين تقويم‌ها تا کنون پشت سر گذاشته‌اند. البته اين اعداد مطابق واقعيت نيستند! ولي به محاسبات ما اشکالي وارد نمي‌کنند.
در تقسيم 1382 بر 4 خارج قسمت برابر 345 مي‌شود و اين عدد براي تقويم ميلادي برابر 500 است.
خب پس تا کنون بر اساس تقويم شمسي 345 سال کبيسه بوده و بر اساس تقويم ميلادي 500 سال برابر سال کبيسه بوده‌اند. (البته همان طور که ديد به کبيسه بودن سالي که در آن هستيم هنوز توجهي نکرديم.)
خب برگرديم به مساله‌ي خودمان که مي‌خواستيم دو تاريخ 13/4/1383 و 3/7/2004 به روز تبديل کنيم.
براي اين کار بايد از عدد سال يکي کم کرده و در 365 ضرب کنيم. و از عدد ماه نيز بايد يکي کم کرده و بر اساس نوع تقويم بايد عدد ماه را ضرب در عدد خاصي بکنيم. مثلا وقتي در تاريخ شمسي از عدد ماه يکي کم کنيم حاصل 3 مي‌شود. همان طور که مي‌دانيد در تقويم شمسي 3 ماه اول سال 31 روز دارند، پس 3 را در 31 ضرب مي‌کنيم. ولي در تاريخ شمسي وقتي از 7 يکي کم کينم برابر 6 مي‌شود. خب بايد در اين مورد ببينيم که 6 ماه اول سال ميلادي چند روزه هستند.
ماه اول ميلادي = 31 روز
ماه دوم ميلادي = 28 روز (در سال کبيسه 29 روز)
ماه سوم ميلادي = 31 روز
ماه چهارم ميلادي = 30 روز
ماه پنجم ميلادي = 31 روز
ماه ششم ميلادي = 30 روز
ماه هفتم ميلادي = 31 روز
ماه هشتم ميلادي = 31 روز
ماه نهم ميلادي = 30 روز
ماه دهم ميلادي = 31 روز
ماه يازدهم ميلادي = 30 روز
ماه داوزدهم ميلادي = 31 روز
طبق جدول بالا 6 ماه اول سال 2004 ميلادي برابر 182 روز مي‌باشد. (فراموش نکنيد که سال 2004 سال کبيسه است.) خب تا حالا عدد سال و ماه را به روز تبديل کرديم و اين دو عدد را بايد به اضافه‌ي عدد روز کنيم و در آخر به اضافه‌ي تعداد سال‌هاي کبيسه گذشته بکنيم. داريم
A = (1382*365)+(3*31)+13+345 = 504881
B= (2003*365)+(31+29+31+30+31+30)+3+500=731780
B-A = 226899
با محاسبات فوق خواستم نشان بدهم که عدد 226899 که در اول بحث گفتيم را از کجا آورديم. همان طور که احتمالا تا حالا فهميديد اين عدد (226899) تفاوت مبداهاي دو تقويم ميلادي و شمسي به روز هستند.
حال مثالي مي‌زنم براي تبديل تاريخ شمسي به تاريخ ميلادي. فرض کنيد که مي‌خواهيم که تاريخ 15/4/1383 شمسي را به تاريخ ميلادي نظير آن تبديل کنيم. در ابتدا بايد اين تاريخ را به روز تبديل کنيم. طبق روش گفته شده در بالا مي‌نويسيم:
C =[(1383-1)*365]+[(4-1)*31]+15+345 = 504883
خب اين عدد را بايد به اضافه‌ي 226899 بکنيم:
504883+226899 = 731782
حال بايد 731782 را به تاريخ ميلادي متناظر آن تبديل کنيم.
ابتدا بايد تعدا سال‌هاي کبيسه‌ي تقويم ميلادي را از اين عدد کنيم، در بالا ديديم که تقويم ميلادي تا کنون 500 سال کبيسه را پشت سر گذاشته است.
731782-500=731282
حال 731282 را بر 365 تقسيم مي‌کنيم و خارج قسمت آن را به اضافه‌ي يک مي‌کنيم و عدد به دست آمده عدد سال است :
731282 / 365 = 2003
2003 + 1= 2004
باقيمانده‌ي تقسيم فوق برابر 187 مي‌باشد. حال با استفاده از جدول تعداد روز‌هاي تقويم ميلادي شروع مي‌کنيم از 187 کم مي‌کنيم و باز هم فراموش نمي‌کنيم که سال 2004 ميلادي سال کبيسه است :
187-31=156
156-29=127
127-31=96
96-30=66
66-31=35
35-30=5
خب تفريق‌هاي فوق را تا جايي ادامه مي‌دهيم که عدد به دست آمده کمتر از تعداد روزهاي يک ماه باشند. در بالا 6 مرحله تفريق انجام دهيم به عدد 6 بايد يک بيافزاييم تا تعداد ماه‌ها به دست آيد. و عدد ظاهر شده در تفريق آخر نيز برابر عدد روز مي‌باشد. پس با محاسبات فوق ديديم که تاريخ 15/4/1383 شمسي برابر 5/7/2004 است.
اين روش کلي تبديل دو تاريخ به يکديگر است. و براي تبديل انواع تقويم به هم بايد اين مراحل را انجام داد ولي با توجه به نوع تقويم‌ها عددهايي که بايد اضافه يا کم بشود طبعا فرق مي‌کند.
موفق باشيد

دانلود آخرین نسخه جومفا


تبلیغات


ماهنامه مدیریت محتوای فارسی


مقالات آموزشی

  • 1

آخرین افزونه ها

آخرین اطلاعیه در مورد جوملا ۱.۶

آخرین نسخه جوملا سری ۱.۶ : ۱.۶ بتا ۵

این نسخه آزمایشی بوده و لطفا در وب سایت استفاده نشود.

http://www.joomla.org/images/stories/beta_logo.png