soheilyou
جمعه 21 فروردین 1394, 13:38 عصر
من یه سوال داشتم در مورد تاریخ شمسی در php ! ینی بهتره بگم میخوام مطمئن بشم !
من تا حالا هر بار قرار بود با تاریخ شمسی کار کنم از http://jdf.scr.ir/ برای به دست آوردن تاریخ شمسی استفاده می کردم ! ینی فایل jdf.php رو در فایل اصلیم به این صورت به کار میبردم :
//----------------------Tarikh shamsi --------------------------------$timezone = 0;//براي 3:30 عدد 12600 و براي 4:30 عدد 16200 را تنظيم کنيد$now = date("Y-m-d", time()+$timezone);
$time = date("H:i:s", time()+$timezone);
list($year, $month, $day) = explode('-', $now);
list($hour, $minute, $second) = explode(':', $time);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
include ('jdf.php');
$today_jalali_date = jdate("Y/m/d",$timestamp);
//----------------------Tarikh shamsi --------------------------------در این کد خام تاریخ الزاما به صورت 10 کرکتری برگردونده نمیشد مثلا 1394/2/4 رو بر میگردوند !
برای همین من یه تابع نوشتم که هر تاریخی بهش داده بشه به صورت استاندارد 10 کرکتری تصحیح میکنه و بر میگردونه ! مثلا تاریخ گفته شده رو به 1394/02/04 تبدیل میکنه به این صورت :
/*--------------------------------------\ تابع استاندارد کننده فرمت تاریخ سهیل ----------------------------------------*/ function true_cal($full_date) //Tashih Formate Tarikh be 10 charecter { $date_array= explode("/",$full_date); $year = $date_array[0] ; $mounth = $date_array[1] ; $day = $date_array[2] ;
if( $mounth < 10 ) { if(strlen($mounth) <2 ) { $mounth = '0'.$mounth ; } } if( $day < 10 ) { if(strlen($day) <2 ) { $day = '0'.$day ; } } return $year.'/'.$mounth.'/'.$day; }
و به این ترتیب تاریخ امروز رو میتونستم به صورت شمسی و 10 کرتری داشته باشم و با این فرمت 1394/02/04 در دیتابیس در فیلد تاریخ که به صورت varchar ثبت شده ، ذخیره کنم !
حالا از این این کوئری رو استفاده میکنم :
$taghliz_obj_not = $db -> prepare("select * from `osare_taghliz` WHERE ( first_confirm_for_lab_test <= '$real_today' AND finished ='mojoud' AND first_seen='wating' ) OR ( second_check_date <= '$real_today' AND finished ='mojoud' AND second_seen='wating' ) ORDER BY id DESC ");
$taghliz_obj_not -> execute();
که توش $real_today تاریخ 10 کرکتری امروز هستش (مثلا 1394/01/20)
و first_confirm_for_lab_test هم یکی از فیلد های دیتابیس هستش که به صورت varchar هست و درش تاریخ 10 کرکتری ثبت و ساختار second_check_date هم همینطوره !
منظور از عبارت : first_confirm_for_lab_test <= '$real_today اینه که اگر تاریخ امروز ، مساوی ، یا بزرگتر از تاریخ ثبت شده در فیلد first_confirm_for_lab_test هست !
تکرار میکنم که داخل دیتا بیس در first_confirm_for_lab_test تاریخی مثلا به این شکل : 1394/03/05 ثبت شده !
حالا این کوئری تا کنون بدون مشکلی کار کرده و و کاملا درست تشخیص میده که آیا از تاریخ خاصی رد شدم یا نه ، هنوز به آن تاریخ نرسیدم !
ولی من نمیدونم این روشی که اسفاده کردم اصولی هست یا نه ، آیا قابل اطمینان هست یا نه ؟
چون مثلا میخوام این روش رو برای دادن هشدار به رسیدن تاریخ چک ها استفاده کنم و اگر حتی یکبار اشتبه کنه ضرر و زیانش زیاده !
و لطفا اگر این روش درست نیست ، یه روش کامل و درست رو بهم پیشنهاد کنید !
ممنون از کمکتون
من تا حالا هر بار قرار بود با تاریخ شمسی کار کنم از http://jdf.scr.ir/ برای به دست آوردن تاریخ شمسی استفاده می کردم ! ینی فایل jdf.php رو در فایل اصلیم به این صورت به کار میبردم :
//----------------------Tarikh shamsi --------------------------------$timezone = 0;//براي 3:30 عدد 12600 و براي 4:30 عدد 16200 را تنظيم کنيد$now = date("Y-m-d", time()+$timezone);
$time = date("H:i:s", time()+$timezone);
list($year, $month, $day) = explode('-', $now);
list($hour, $minute, $second) = explode(':', $time);
$timestamp = mktime($hour, $minute, $second, $month, $day, $year);
include ('jdf.php');
$today_jalali_date = jdate("Y/m/d",$timestamp);
//----------------------Tarikh shamsi --------------------------------در این کد خام تاریخ الزاما به صورت 10 کرکتری برگردونده نمیشد مثلا 1394/2/4 رو بر میگردوند !
برای همین من یه تابع نوشتم که هر تاریخی بهش داده بشه به صورت استاندارد 10 کرکتری تصحیح میکنه و بر میگردونه ! مثلا تاریخ گفته شده رو به 1394/02/04 تبدیل میکنه به این صورت :
/*--------------------------------------\ تابع استاندارد کننده فرمت تاریخ سهیل ----------------------------------------*/ function true_cal($full_date) //Tashih Formate Tarikh be 10 charecter { $date_array= explode("/",$full_date); $year = $date_array[0] ; $mounth = $date_array[1] ; $day = $date_array[2] ;
if( $mounth < 10 ) { if(strlen($mounth) <2 ) { $mounth = '0'.$mounth ; } } if( $day < 10 ) { if(strlen($day) <2 ) { $day = '0'.$day ; } } return $year.'/'.$mounth.'/'.$day; }
و به این ترتیب تاریخ امروز رو میتونستم به صورت شمسی و 10 کرتری داشته باشم و با این فرمت 1394/02/04 در دیتابیس در فیلد تاریخ که به صورت varchar ثبت شده ، ذخیره کنم !
حالا از این این کوئری رو استفاده میکنم :
$taghliz_obj_not = $db -> prepare("select * from `osare_taghliz` WHERE ( first_confirm_for_lab_test <= '$real_today' AND finished ='mojoud' AND first_seen='wating' ) OR ( second_check_date <= '$real_today' AND finished ='mojoud' AND second_seen='wating' ) ORDER BY id DESC ");
$taghliz_obj_not -> execute();
که توش $real_today تاریخ 10 کرکتری امروز هستش (مثلا 1394/01/20)
و first_confirm_for_lab_test هم یکی از فیلد های دیتابیس هستش که به صورت varchar هست و درش تاریخ 10 کرکتری ثبت و ساختار second_check_date هم همینطوره !
منظور از عبارت : first_confirm_for_lab_test <= '$real_today اینه که اگر تاریخ امروز ، مساوی ، یا بزرگتر از تاریخ ثبت شده در فیلد first_confirm_for_lab_test هست !
تکرار میکنم که داخل دیتا بیس در first_confirm_for_lab_test تاریخی مثلا به این شکل : 1394/03/05 ثبت شده !
حالا این کوئری تا کنون بدون مشکلی کار کرده و و کاملا درست تشخیص میده که آیا از تاریخ خاصی رد شدم یا نه ، هنوز به آن تاریخ نرسیدم !
ولی من نمیدونم این روشی که اسفاده کردم اصولی هست یا نه ، آیا قابل اطمینان هست یا نه ؟
چون مثلا میخوام این روش رو برای دادن هشدار به رسیدن تاریخ چک ها استفاده کنم و اگر حتی یکبار اشتبه کنه ضرر و زیانش زیاده !
و لطفا اگر این روش درست نیست ، یه روش کامل و درست رو بهم پیشنهاد کنید !
ممنون از کمکتون