تاریخ شمسی بر پایه Unixtime
درود بر شما،
مدت بسیار زیادی است که نوشتن در دنیای متن/باز را ترک کردهام و اما این نشانه کم شدن علاقه من نسبت به این دنیا نمیباشد، خارج از این گفتار، برویم سراغ اصل مطلب.
سالها پیش (چیزی بیش از ۸ سال پیش)، بسیاری از برنامه نویسان PHP مشکلی بزرگی در نمایش تاریخ به صورت شمسی (جلالی) را داشتند، از این رو شخصی به نام میلاد راستیان (که از دوستان گرامی بنده هستند)، آغاز به نوشتن دو تابع gregorian_to_jalali و jalali_to_gregorian جهت تبدیل تاریخ میلادی به شمسی و شمسی به میلادی کرده بود، شایان ذکر است چندین تابع بر پایه همین دو تابع نیز نوشته شد که کار برنامه نویسان را برای نمایش تاریخ شمسی و همچنین تبدیل این دو تاریخ به یکدیگر بسیار آسان میکرد.
هر چند که این دو تابع توسط آقایان روزبه پورنادر و محمد طوسی نوشته شد، اما زحمت تبدیل و البته توابع دیگر جهت استفاده از این دو تابع در PHP را میلاد راستیان به گردن گرفت، پس از ارائه نخستین نسخه از این کتابخانه، بسیاری از نرمافزار ها همانند مامبو و … از آن جهت نمایش تاریخهای خود بصورت شمسی استفاده کردند.
همچنین بسیاری از برنامه نویسان نیز با کمی تغییر این کتابخانه را به نام خود منتشر کردند ;)، اما آن چیزی که پیداست تشکری بوده که باید از زحمات میلاد راستیان برای نوشتن این کتابخانه که سالیان سال مشکل تاریخ شمسی در PHP را حل کرده، بکنیم.
و اما بزرگترین مسئله ای که در تقریبا تمام توابع شمسی سازی که وجود دارد حتی توابع نوشته شده بر پایه Datetime، تبدیل تاریخ میلادی به شمسی است، یعنی شما میبایست نخست تاریخ میلادی را محاسبه کرده، وارد تابع کنید و سپس خروجی شمسی بگیرید، هر چند این تابع با ایجاد یک تابع کمکی بصورت خودکار انجام شود، اما این روندی است که باید طی شود، همچنین این پروسه برای تبدیل تاریخ شمسی به میلادی تکرار میشود.
حال امروز در مورد نمایش تاریخ شمسی بدون واسطه یک تاریخ میلادی صحبت میکنیم، یعنی برنامه مستقیما همان Unixtime را گرفته و خروجی به شما تاریخ شمسی را میدهد، بدون نیاز تبدیل کردن به تاریخ میلادی و سپس محاسبه تاریخ شمسی، جالب است نه؟
اینکار باعث میشود تا بسیاری از مشکلات در روند محاسبه سال کبیسه و تغییرات ممکن که در بین تاریخ میلادی و شمسی است مرتفع شود، زیرا با اینکار دیگر تاریخ ها به یکدیگر تبدیل نمیشوند، بلکه هر کدام بر مبنی Unixtime تاریخ صحیح را نمایش میدهند، همچنین برای تبدیل تاریخ شمسی به Unixtime نیز دیگر نیاز به واسط تاریخ میلادی نمیباشد، زیرا تابعهای نوشته شده خود توانایی محاسبه زمان طی شده تا مبدا Unixtime را خواهند داشت.
از دیدگاه من، این روند محاسبه جهش بزرگی در ثبت و نمایش تاریخ شمسی به شمار میرود و امیدوارم با استفاده از این کتابخانه بسیاری از مشکلات شما برنامه نویسان گرامی جهت ذخیره و یا نمایش تاریخ شمسی و تفاوت های موجود حل شود. همچنین سرعت و بازدهی بیشتری را در اختیار شما قرار دهد.
شرح استفاده:
نخست کتابخانه jdate را فراخوانی کنید، سپس میتوانید با تابع show_date همانند date تاریخ نمایش دهید، که پارامتر اول فرمت تاریخ و پارامتر دوم Unixtime موجود است.
نمونه:
1 2 3 4 5 6 7 8 9 10 11 | // Ex. 1 $date = new jdate(); echo $date->show_date("Y-m-d H:i:s, l"); // Ex. 2 $date = new jdate(); echo $date->show_date("Y-m-d H:i:s, l", time()); // Ex. 3 $date = new jdate(); echo $date->junixtime("1390-11-20 10:52:30"); |
توجه ۱:
۱. خالی بودن پارامتر اول فرمت Y-m-d H:i:sرا نشان میدهد
۲. خالی بودن پارامتر دوم Unixtime حاضر را خروج میدهد
همچنین تابع jdate ورودی Unixtime گرفته و خروجی آرایه تاریخ شمسی را نشان میدهد.
و تابع junixtime تاریخ شمسی شما را بصورت Unixtime میدهد، فرمت مورد پذیرش این تابع Y/m/d و Y-m-d بدون/با H:i:s است، نمونه: ۱۳۸۹/۱۲/۲۳ ۲۳:۱۲:۵۰
توجه ۲:
خروجی Unixtime در هر کجای این کتابخانه را اگر وارد date زبان php یا هر مبدل دیگر کنید، به شما تاریخ میلادی حاضر را نشان میدهد، همان طور که مشاهده میکنید کار شما بسیار ساده شده است :)
نکته پایانی:
۱. این کتابخانه بر پایه قوانین GNU/GPL نسخه ۳ نگارش شده است، میتوانید این اجازهنامه را بصورت فارسی از اینجا بخوانید.
۲. این کتابخانه بصورت رایگان و بدون هیچ چشمداشتی به شما ارائه میشود، توجه داشته باشید این کتابخانه حاصل نخوابیدنها و مطالعات فراوان بر تاریخ شمسی و Posix time است، انتظار میرود در صورت انتشار مجدد این کتابخانه نام نگارنه این کتابخانه، یعنی سید بهرام سیادتی درج گردد.
۳. امیدوارم با انتشار این کتابخانه نوین، کمکی به دنیای متن/باز و برنامه نویسی تحت زبان برنامه نویسی PHP کرده باشم.
جهت دریافت و مشاهد سورس کامل کتابخانه اینجا کلیک کنید
پاسخ میلاد راستیان به این پست:
سلام
ایول بعد از مدته ها یک تکونی به تبدیل تاریخ دادی!
توابع که از روی کد من نوشته شده بودند با اینکه امکاناتی رو اضافه کرده بودند ولی سعی نکرده بودند که ایده جدیدی رو اضافه کنند!
آیا شما از این ارسال لذت بردید؟ چرا دیدگاه خود را در زیر نمی نویسید و گفتگو را ادامه دهید، یا مشترک خوراک من شوید و مقاله هایی مانند این را روزانه به صورت خودکار به خواننده خوراک خود انتقال دهید.
بازتاب ها & بازخوان ها
دیدگاه ها
دیدگاه خود را بنویسید
خط و پاراگراف به طور خودکار شکسته خواهند شد، آدرس ایمیل هیچگاه نمایش داده نخواهد شد، HTML مجاز: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

جناب آقای سیادتی عزیز،
از انتشار این کتابخانه ارزشمند از شما ممنونم، این حرکات و ارائه چنین زحماتی آن هم بصورت رایگان و متن باز کمک بسیار زیادی به کشور عزیزمان خواهد کرد، و امیدوارم قدر افرادی مثل شما را در این کشور بدانند.
جهان رمدانی
بهرام تو فوق العاده ای! واقعا باعث افتخاره که جزو دوستات هستم,هر چند یه دوست ساده!
بهت افتخار میکنم! امیدوارم هرجا که هستی سلامت باشی و هر روز موفق تر از دیروز! خدا پشت و پناهت!
درود،
از شما سپاسگزارم آقای رمدانی … لطف شما زیاده …
درود،
حسین جان، خیلی مخلصیم رفیق ;)، تو لطف داری
سلام
خیلی کار قشنگی کردی بهرام جان
ممنونم و ایشالا موفق باشی
یا علی
سلام بهرام جان
همیشه گفتم بازم میگم
ما تو ساری و جمع ما تو ایران به داشتن دوستی مثل تو افتخار و به خودمون میبالیم
سربلند باشی
درود،
سپاسگزارم حسین جان …
ممنون محمدباقر جان
کار خیلی مفیدی بود
ممنون
امیدوارم موفق باشید
سپاسگزارم پیام جان …
سلام
بابت حرکت جالبتون ممنون عالی بود. اما فکر میکنم این مشکل رو وحید سهراب لو حل کرده بود. اگر اشتباه میکنم. تفاوت ها در چیست؟ بیشتر مد نظرم هست که ایا الگوریتم محاسبه فرق دارد؟
نسخه نام برده در iranphp.org قابل دریافت هست.
مورد بعدی هم بد نیست در گیت هاب هم منتشر کنید.
شاد باشید
سوزنچی
درود بر شما،
از پیام شما سپاسگزارم صالح جان
اگر توجه کنید آقای وحید سهرابلو همانطور که خودشان هم اشاره کردند، کتابخانه نوشته شده بر پایه jdate میلاد راستیان میباشد، و همان روند تبدیل تاریخ میلادی به شمسی را انجام میدهد، اما کتابخانه نوشته توسط من، بر پایه unixtime تاریخ میسازد …
سربلند باشید …
سلام.
ممنونم از کارتان…
سلام
بابت زحماتی که برای تهیه این کلاس متحمل شدین ازتون سپاسگزارم دوست من
اگه پروژه رو گیت هاب هم قرار بدین خیلی خوب میشه
یه سوال کوچیک: توی تستی که من از کدتون انجام دادم خروجی ۱۲۶۰۰ ثانیه یعنی ۳ ساعت و نیم عقبه
این به چه دلیل میتونه باشه؟
پاینده باشید
از شما سپاسگزارم،
حتما سعی میکنم اینکار رو انجام بدم.
در مورد عقب بودم ۳:۳۰ به این دلیل هست که در تنظیمات PHP وقتی شما مثلا ایران را انتخاب میکنید و از فرمان time استفاده میکنید در هر صورت unixtime مربوط به تایم زون GMT به شما داده میشود … در نتیجه اگر میخواهید خروجی تاریخ بگیرید کافیست در مقدار show_date این گونه عمل کنید:
$jdate->show_date(“Y-m-d H:i:s”, time()+((3.5 * 60) * 60)
با سلام ضمن تشکر از زحمتی که بابت برنامه کشیده اید سوالی داشتم که در صورت امکان راهنمایی بفرمایید
من یک crm بر پایه اژاکس و php بنام epesi که لینکش را در زیر گذاشته ام را مورد بررسی و کار قرارداده ام و طی بررسی های بعمل امده متاسفانه تقویم جلالی را پشتیبانی نمیکند و سعی و کوشش من تابدینجا بی نتیجه بوده است ایا با این تابع و برنامه شما امکان راه اندازی تقویم ایرانی ان وجود دارد اگر بتوانید راهنمایی بفرمایید ممنون میشوم
http://www.epesi.org/index.php?title=Main_Page
درود بر شما،
دوست گرامی شما میتوانید با این کتابخانه جهت نمایش تاریخ شمسی و همچنین در زمان ذخیره بواسطه junixtime مقدار unixtime را گرفته تا در بانک اطلاعاتی بصورت تاریخ میلادی نیز ذخیره کنید. و در این بابت مشکلی وجود ندارد.
البتّه در حال حاضر نسخه ی بسیار جدیدتر و کاملتری وجود داره که از نشانی
http://jdf.scr.ir
قابل دریافت است.
لطفاً این سایت رو مشاهده بفرمایید.
درود بر شما،
دوست گرامی گمانم شما بدون هیچ گونه مطالعه این مطلب نظر نوشتید، تابع نوشته شده در این سایت هماند روند پیشین یعنی تبدیل تاریخ میلادی به شمسی را دنبال میکند و تغییرات جزئی ارائه شده همان کتابخانهای است که آقای راستیان زحمت آن را کشیدند :-)
بله در این مورد حق با شماست.
امّا باید به این نکته نیز توجّه داشت که برچسب زمان یونیکس از
۲۱۴۷۴۸۳۶۴۷- (منفی)
تا
۲۱۴۷۴۸۳۶۴۷ (مثبت)
در اکثر سرورها تعریف شده است.
آیا توابع شما با برچسب کوچکتر از صفر (منفی) ، یعنی در تاریخ های قبل از ۱۹۷۰ نیز کار می کنند؟
درضمن ، یکی از مزایای دیگر استفاده از date ، قابل تنظیم بودن اختلاف ساعت به وسیله ی تابع date_default_timezone_set می باشد که حتّی عمل جلو و عقب کشیدن ساعت در ۱ فروردین و ۳۰ شهریور نیز به خوبی انجام می شود.
امّا در روش شما ، خیر. مثلاً ساعت ثبت همین نظرات ، که یک ساعت جلو است.
درود بر شما،
بله در تابع نوشته شده، تاریخ پیش از ۱۹۷۰ و پس از ۱۹۷۰ به درستی کار میکند، در مورد timezone همان طور در پرسش یکی دیگر از کاربران نیز عرض کردم، unixtime همیشه بر مبنی GMT است، در نتیجه اگر قرار است شما اختلاف زمانی را کار کنید، باید بر مبنی کشور خودتان وارد کنید که توضیح در همین کامنت ها موجود است میتوانید بخوانید، در مورد یک ساعت جلو و عقب بودن باید عرض کنم بنده از WordPress Persian استفاده میکنم و دقیقا از همان تابع jdate برای تبدیل تاریخ میلادی به شمسی استفاده میکند … پس اگر مشکلی هست قطعا از همان تابع است :-)
البته باید بررسی کنید ، حتماً WordPress Persian هنوز از jdate قدیمی آقای میلاد راستیان استفاده می کند.
می توانید نسخه ی جدید را جایگزین نموده و شاهد رفع این مشکل باشید.
متاسفانه شما اصلا متوجه نیستید که تبدیل تاریخ و ساخت تاریخ چه تفاوتی با هم دارند،
کامیاب و سربلند باشید
یاعلی
سلام
ایول بعد از مدته ها یک تکونی به تبدیل تاریخ دادی !
توابع که از روی کد من نوشته شده بودند با اینکه امکاناتی رو اضافه کرده بودند ولی سعی نکرده بودند که ایده جدیدی رو اضافه کنند !
کار بسیار جالبیه.
به عنوان یک پروژه ی متن باز و از نظر آموزشی ، خیلی مفیده.
امّا برای استفاده ی رسمی در یک سایت ، مناسب نیست. زیرا هنوز کامل نشده.
فعلاً توابع امثال
jdate
قابلیت کنترل و تنظیم بیشتری دارند.
مثلاً امکان تنظیم منطقه ی زمانی که جلو و عقب کشیدن ساعت در نیمه ی اوّل و دوم سال هم به صورت خودکار ، انجام می شود.
در واقع پروژه ی شما به دلیل وابسته نبودن به توابع تاریخ و زمان پی اچ پی ، امکانات محدودتریی ارائه می دهد.
البتّه این پروژه برای تبدیل به زبان های برنامه نویسی دیگر نیز بسیار مناسب است.
از نظر شما سپاسگزارم دوست خوبم، افزودن چنین مسئلهای اصلا کار سختی نیست که کل یک الگوریتم رو زیر سوال ببریم و بگیم در حد آموزشی خوبه، یه آرایه تنظیم کنید و timezone شیش ماه اول و آخر رو بهش اضافه کنید :-)
سلام بهرام جان. میدونم اینجا نباید این سوالو بپرسم. ببخشید
یه سوال فنی دارم. شاید اکثر ما بلد باشیم به راحتی یک کد php را با html ادغام کنیم. اما من میخوام یه چیزیو بدونم. روش صحیح و استاندارد برای ادغام کدهای php و html چیه ؟ روشی که سایتهای بزرگ ساخته شده با cms و یا حتی facebook انجام داده چیه ؟ چطور باید در یک فایل php کدهای html , javascrip,css و… را به زیبایی جا داد تا شلوغ نشه و راه درست و استاندارد باشه.
سپاس از زمانی که خواهی گذاشت.
سپاسگذارم که زمانتون را به من میدین.
درود،
والا فاضل جان من فکر می کنم بهترین روش برای استفاده HTML در PHP استفاده از فرمولهای MVC باشه …
http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller