اضافه کردن صفر پیشوند (Leading Zero) به مقادیر ماه و روز در رشته تاریخ در PHP
صفر پیشوند (Leading Zero)
در تبدیل و کار با رشته های تاریخ در هر زبان برنامه نویسی همواره نگرانی ها و چالش های زیادی پیش روی برنامه نویسان پارسی به دلیل استفاده از تاریخ هجری شمسی (جلالی) وجود دارد. به دلیل اینکه انواع داده های DateTime در زبان های مختلف برای تاریخ پارسی بهینه نبوده و اغلب قابل استفاده نیستند همواره برنامه نویسان از مکانیزم هایی (کلک رشتی) مثل تبدیل تاریخ میلادی به شمسی و برعکس بهره می برند و اگر هم بخواهند تاریخ را شمسی ذخیره کنند یکی از محتمل ترین راهها استفاده از نوع داده رشته ای (String) می باشد. مشکل از جایی شروع می شود که بخواهیم بر روی این مقادیر رشته ای که تاریخ شمسی را نمایش می دهند عملیاتی نظیر مقایسه دو تاریخ، مرتب سازی و ایندکس بندی را انجام دهیم، ممکن است بدلیل شرایط خاص داده های رشته ای این اعمال به درستی انجام نشوند. به طور مثال سیستم دو تاریخ 1393/4/5 و 1393/04/05 را یکی نمی داند و این دو رشته یکی با طول 8 و دیگری با طول 10 به درستی با هم مقایسه نشده و در مرتب سازی نیز درست مرتب نمی شوند. برای غلبه بر این مشکل بهترین راه حل اضافه کردن صفر پیشرو (Leading Zero) به قسمت های ماه و روز در رشته تاریخ می باشد تا همه رشته ای تاریخ با هم هم تراز و از نظر طول یکسان گردند تا در عملیات مرتب سازی و مقایسه مشکلی بوجود نیاید. در زیر قطعه کدی که این عملیات را با دریافت رشته تاریخ انجام میدهد ارائه شده است که امیدوارم برای شما دوستان عزیز مفید باشد.
//تابع اضافه کردن صفر به قبل از مقادیر ماه و روز تاریخ function addLeadingZero($DateStr){ try{ if(strlen($DateStr)<=10){ if(strpos($DateStr,'/') != false) { $targetChar = '/'; } else if (strpos($DateStr,'-')!= false){ $targetChar = '-'; } $dateArr= explode($targetChar,$DateStr); if(strlen($dateArr[1]) < 2) $dateArr[1]='0'.$dateArr[1]; if(strlen($dateArr[2]) < 2) $dateArr[2]='0'.$dateArr[2]; return $dateArr[0].$targetChar.$dateArr[1].$targetChar.$dateArr[2]; }else{ echo 'Invalid Date Format'; return -1; } } catch (Exception $e) { echo "بروز خطا:".$e->getMessage()."n"; } }
ورودی این تابع باید حتما رشته ای از تاریخ باشد که با کاراکتر / اسلش از هم جدا شده باشند. اگر جداکننده شما کاراکتر دیگری است می توانید در خط 10در پارامترهای ورودی تابع Explode آن را تغییر دهید. تابع Explode رشته ای را گرفته و آن را بر اساس کاراکتر جداکننده ای که به تابع معرفی می شود جدا کرده و به آرایه ای متشکل از قطعات جدا شده از هم تبدیل می کند و بر می گرداند. در خط های 11 و 12 با بررسی طول مقادیر داخل سلول های ماه و روز اگر طول آنها کمتر از 2 باشد (یا می توان گفت اگر طول آنها برابر یک باشد) به اول آن کاراکتر 0 (Zero) اضافه شده و دوباره در همان سلول ذخیره می شود.
در انتها رشته تاریخ اصلاح شده برگشت داده می شود.