ذخیره و نمایش تاریخ شمسی / میلادی با استفاده از کتابخانه Pdate

Mr.Steres

Active Member
سلام .

یکی از مورد هایی که بین کاربران ایرانی و یا حتی برنامه نویس های ایرانی دیدم این بوده که تاریخ رو در بانک اطلاعاتی خودشون درست ذخیره نمی کنند و با اینکه به جوابی که می خوان می رسن ولی با کد نویسی بسیار زیاد و غیراصولی ...

شما می تونید تاریخ و زمان رو به صورت timestamp ذخیره کنید در بانکتون و اون رو به هر صورتی که دلتون می خواد چه شمسی و چه میلادی برگردونید و روش محاسبات مربوط به تاریخ رو راحت انجام بدید !

روش کار به این صورت هست که اول timestamp رو با تابع تایم به دست بیاریم :

PHP:
$time = time() ;

( ما اینجا فرض کردیم که شما تاریخ رو به صورت timrstamp توی بانک ذخیره کردید و حالا خوندین و توی تابع تایم ریختید )

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

PHP:
$time = getdate($time) ;
// Print associative array
print_r($time) ;

خروجی اون توی زمان حالا این میشه :

کد:
Array ( [seconds] => 51 [minutes] => 17 [hours] => 10 [mday] => 21 [wday] => 1 [mon] => 6 [year] => 2010 [yday] => 171 [weekday] => Monday [month] => June [0] => 1277115471 )

با تابع Getdate() توی تایم یک associative array ریخته می شه که شما می تونید ازش seconds , minutes , hours , mday , wday , mon , year , yday , weekday , month رو برگردونید .

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

PHP:
$time = pgetdate($time) ;
// Print associative array
print_r($time) ;

اینجا هم به جای Getdate از PGetdate استفاده میشه که به صورت همین getdate کار می کنه با این تفاوت که تاریخ و اطلاعات شمسی رو بر می گردونه ...

تموم شد ... شما می تونید به طور هم زمان و راحت هم تاریخ شمسی و هم میلادی ( مثلا برای ساختن سایت مپ ) داشته باشید

موفق باشید / Mr.Steres
 

peyman1987

Member
دوست عزیز ممنون از آموزش خوبی که زحمتش رو کشیدی. بعد از خوندن مطلبت یه نکته ای به ذهنم رسید که شاید بی ربط به این موضوع نباشه (در واقع میشه گفت کاملا مربوطه). اول متنت درباره روش درست ذخیره تاریخ و زمان توی دیتابیس گفتی و روشی هم که گفتی روش بسیار خوب و اصولیه. اینکه زمان رو بصورت TimeStamp ذخیره کنیم کاملا درست ولی بنظرم میاد اگر زمان رو بجای اینکه یه فیلد رشته ای ایجاد کنیم و حاصل تابع Time رو داخلش قرار بدیم ، داخل فیلدی از نوع Timestamp خود MySQL ذخیره کنیم مزیت های فوق العاده زیادی داره که کلی از کدنویسی PHP کم میکنه و میشه اکثر شرط ها و محاسبات رو بوسیله خود MySQL انجام داد. همینطور برگردوندن این زمان برای استفاده توسط توابع PHP هم بسیار ساده میشه. اگر دوستان علاقه داشتن میتونیم درباره این موضوع هم بحث کنیم.
 

ziXet

مدیر انجمن PHP/MYSQL
دوست عزیز ممنون از آموزش خوبی که زحمتش رو کشیدی. بعد از خوندن مطلبت یه نکته ای به ذهنم رسید که شاید بی ربط به این موضوع نباشه (در واقع میشه گفت کاملا مربوطه). اول متنت درباره روش درست ذخیره تاریخ و زمان توی دیتابیس گفتی و روشی هم که گفتی روش بسیار خوب و اصولیه. اینکه زمان رو بصورت TimeStamp ذخیره کنیم کاملا درست ولی بنظرم میاد اگر زمان رو بجای اینکه یه فیلد رشته ای ایجاد کنیم و حاصل تابع Time رو داخلش قرار بدیم ، داخل فیلدی از نوع Timestamp خود MySQL ذخیره کنیم مزیت های فوق العاده زیادی داره که کلی از کدنویسی PHP کم میکنه و میشه اکثر شرط ها و محاسبات رو بوسیله خود MySQL انجام داد. همینطور برگردوندن این زمان برای استفاده توسط توابع PHP هم بسیار ساده میشه. اگر دوستان علاقه داشتن میتونیم درباره این موضوع هم بحث کنیم.
فکر کنم ایشون هم نگفت که به صورت رشته ذخیره کنی! یه مزیت دیگه ای هم که داره اینه که میشه حالت دیفالت رو روی current_timestamp گذاشت تا هربار لازم نباشه تابع time رو تو کوئری فراخونی کنیم!
البته اگه یه فیلد int با طول 11 هم درنظر بگیرید همون کارو میکنه
 

peyman1987

Member
فکر کنم ایشون هم نگفت که به صورت رشته ذخیره کنی! یه مزیت دیگه ای هم که داره اینه که میشه حالت دیفالت رو روی current_timestamp گذاشت تا هربار لازم نباشه تابع time رو تو کوئری فراخونی کنیم!
البته اگه یه فیلد int با طول 11 هم درنظر بگیرید همون کارو میکنه

درسته دوست عزیز منظور منم رشته یا عدد بودن فیلد نبود روش بود. درست میگین یکی از مزیتهاش همینه که میشه دیفالت تعیین کرد که خودش زمان فعلی رو بعنوان مقدار فیلد در نظر بگیره. حتی این امکان هم هست که با هر بار Update شدن رکورد بصورت خودکار مقدار یک فیلد به زمان فعلی تغییر کنه که میشه باهاش مثلا زمان آخرین ویرایش رکوردها رو بصورت خودکار و بدون نیاز به هیچ کدی ذخیره کرد.
 

lepi

Member
با سلام
بنظرم این تاپیک ارزشش رو داره که دوباره بیارمش بالا
و اینجا به مشکلی برخوردم

با استفاده از ویژگی timestamp و استفاده از پیش فرض CURRENT_TIMESTAMP من به همچین نتیجه ای می رسم
کد:
2010-09-15 17:28:43
که در این حالت تابع getdate پاسخ رو با خطای A non well formed numeric value encountered برمیگردونه

ممنون میشم اگر راهنمائیم کنید
 

جدیدترین ارسال ها

بالا