تاریخ شمسی برای لاراول ۵

یکی از نیازهای برنامه‌نویسای ایرانی تو توسعه وب‌سایت‌ها و اپلیکیشن‌ها، تبدیل تاریخ میلادی و شمسی و بالعکسه. برای این کار کتابخونه‌ها و ابزارهای مختلفی برای فریمورک‌ها و زبان‌های برنامه‌نویسی مختلف وجود داره. برای  لاراول ۴ و نسخه‌های قبل‌تر از اون پکیج‌هایی بودند که کار خیلی‌ها رو برای تبدیل تاریخ راه مینداخت، ولی از نسخه ۵ Laravel یک خلاء وجود این کتابخونه با توجه به عدم توسعه پکیج‌های قبلی به وجود اومده، البته اگر نخواهیم از پکیج‌های مخصوص لاراول استفاده کنیم و به پکیج‌های دیگه زبان PHP بسنده کنیم هیچ مشکلی وجود نداره ولی خب بعضی‌ها دوس دارن برای آرامش خاطر هم شده پکیجی باشه که برای لاراول ۵ ساخته شده باشه.

همونطور که مستحضر هستید برای بومی سازی پکیج‌ها و کتابخونه‌ها برای یک فریمورک خاص باید از Service Providerها استفاده کنیم، خب Laravel هم از این قاعده مستثنی نیست. در گذشته پکیج تاریخ‌جلالی که توسط سالارکابلی نوشته شده بود و Bundle اون برای لاراول ۳ استفاده می شد و در لاراول ۴ هم Milad Rey پکیجی نوشته بود که نسخه بهبود یافته اون باندل برای لاراول ۴ بود ولی این پکیج برای لاراول ۵ توسعه داده نشد.

از این رو دست به کار شدم و پکیج مذکور رو برای Laravel ۵ آماده کردم و یه سری تغییرات بسته به نیاز خودم (شاید به درد بقیه هم بخوره) در اون اعمال کردم. برای دریافت این پکیج می‌تونید با استفاده از composer به روش زیر عمل کنید:

سپس فایل config/app.php رو باز کرده و مقادیر زیر رو در آرایه‌های خودشون قرار می‌دیم:

برای اطلاعات بیشتر و نحوه استفاده هم می‌تونید ریپازیتوری‌‌پروژه تو گیت‌هاب رو ببینید و مطالعه کنید. البته هنوز کمبود کتابخونه‌ای مثل Carbon برای فارسی و تاریخ جلالی به شدت احساس می شه.

*** دوستان توجه داشته باشید که این پکیج فقط و فقط کارش نمایش تاریخ میلادی به شمسیه و نه چیز دیگه‌ای. هیچ محاسباتی بر مبنای تاریخ شمسی ارائه نمیده و تمام محاسبات بر مبنای تاریخ میلادیه. 

78 دیدگاه در “تاریخ شمسی برای لاراول ۵

  1. ممنون از اینکه تجربیات و کارهات رو با ما هم به اشتراک میذاری ..
    البته برای Laravel5 قبلا یه پکیج برای تاریخ شمسی ارائه شده بود. خودم تو پروژه قبلیم ازش استفاده کرده بودم. آدرسشه اینه:
    https://packagist.org/packages/parsidev/jalali
    https://github.com/parsidev/Jalali
    ولی برای پروژه جدیدم دارم از Laravel5.1 استفاده میکنم، متاسفانه برای Laravel5.1 هیچ پکیجی برای تاریخ شمسی وجود نداره. برای همین مستقیما از فایل مربوط به کلاس تاریخ شمسی سالار کابلی توی پروژه جدیدم استفاده میکنم.
    اگه پکیجت رو با Laravel5.1 سازگار کنی هم خوب میشه به گمونم.

    • اون پکیجی که ذکر کردین، مشکل زیاد داره. یکیش نداشتن تسته، یکی دیگه ش عدم پشتیبانی از استاندارد psr-4ـه و اینکه فایل‌ها رو مستقیم بدون fork گرفتن از miladr/jalali اومدن کپی/پیست کردن که فکر نمی‌کنم این کار درست باشه.
      برای استفاده در لاراول ۵٫۱ فکر نمی‌کنم مشکلی وجود داشته باشه.

  2. سلام
    ممنون بابت زحماتتون . رو لاراول ۵٫۲ بدون مشکل نصب شد . فقط تو ست آپ کمی تغییرات نیازه مثل این

    Morilog\Jalali\JalaliServiceProvider::class,
    و

    ‘jDate’ => Morilog\Jalali\Facades\jDate::class,
    ‘jDateTime’ => Morilog\Jalali\Facades\jDateTime::class,

    در ضمن کتابخونه فارسی carbon من از این استفاده می کنم شاید به درد دوستان خورد :
    https://github.com/jenssegers/laravel-date/tree/master
    موفقیت

    • سلام. ممنون از اینکه نظرتونو گفتید و خوشحالم که بدون مشکل نصب شده. یه نکته رو باید بگم و اونم اینه که Morilog\Jalali\JalaliServiceProvider::class با ‘Morilog\Jalali\JalaliServiceProvider’ هیچ فرقی نمی‌کنه و شما بسته به نسخه phpتون می‌تونید هرکدومو استفاده کنید.
      در مورد پکیج آقای jenssegers هم قضیه اینه که فقط قابلیت ترجمه‌ به carbon اضافه شده ولی تاریخ شمسی و بومی توش نیست

      • ممنون . بله نسخه های اخیر لاراول فقط با نسخه ۵٫۵ به بالا کار می کنه و برای همین این تغییرات لازمه
        درسته فعلا هم از اون پکیج استفاده می کنم برای ترجمه relative date ها و از کد شما برای تاریخ شمسی که کنار هم تقریبا کامل هستن

  3. جناب پروینی سلام
    دو تا سوال دارم، ممنون میشم جواب بدین
    => برای لاراول ۴٫۲ درج تاریخ و ساعت رو چطور باید انجام داد و توی صفحات سایت درج کنیم.(تاریخ شمسی با ساعت با اعداد فارسی) لطفاً با جزئیات بفرمایید.
    => ایجاد فروم برای سایت ترجیحاً پکیج نباشه.سپاس.

    • در مورد سوال اول که میتونید از همین پکیح استفاده کنید اگه کار نکرد می‌تونید از پکیج Miladr/jalali استفاده کنید که برای لاراول ۴٫۲ـه. پکیج مذکور(دومی) به صورت پیش فرض اعداد رو هم فارسی می‌کنه ولی پکیجی که من توسعه دادم برای نمایش اعداد فارسی، هنگام استفاده از متد format، مقدار true رو به عنوان پارامتر دوم پاس بدید.

      در مورد سوال دومتون هم اگه منظورتون سیستم فرومی که با لاراول نوشته شده باشه، من چیزی رو نمی‌شناسم ولی تو موارد دیگر می‌تونید از bbpress, mybb, phpbb, vbultien استفاده کنید

    • با سلام
      من use Morilog\Jalali\jDate; رو هم در صفحه کنترلر استفاده کردم ولی با خطای زیر مواجه شدم

      htmlentities() expects parameter 1 to be string, object given (View: /Users/aheshmehmilad/Desktop/Charity/resources/views/welcome.blade.php)

      همچنین این خطا

      ErrorException in helpers.php line 531:
      htmlentities() expects parameter 1 to be string, object given

      نمیدونم مشکل کجاست
      ممنون میشم کمک کنید، تشکر

      • این خطا ربطی به این پکیج نداره، شما دارید از تابع htmlentities استفاده میکنید توی کدتون و به جای string دارین بهش object میدین

        • بنده هم همین مشکل دارم. وقتی با تابع date خالی کار میکنم این مشکل وجود نداره. مگر غیر اینکه خروجی jdate(“now”) باید تاریخ امروز به صورت استرینگ باشه؟!!!
          اگر بخوایم مستقیم از این تابع داخل فایل blade استفاده کنیم باید چکار کنیم؟

          • دوستان اگر شما هم با همچین خطایی مواجه هستید، حتما باید فرمت تاریخ رو به صورت متد پاس بدین وگرنه خروجی رو به صورت شی بهتون پاس میده.

          • کلا باید این‌شکلی استفاده کنید ازش:

            jdate(‘GREGORIAN_DATE’)->format(‘YOUR_FORMAT’);

  4. سلام ممنون از اینکه این پکیج رو برای لاراول ۵ آماده کردین. من نصبش کردم ولی یه مشکلی داره ظاهرا. من قبلا از کلاس jDateTime سالار کابلی استفاده کردم و متد checkdate درست کار می کرد ولی توی این پکیج هر تاریخی (شمسی یا میلادی) رو بهش بدی false برمی گردونه. علتش چیه؟

      • من از متد jDateTime::checkdate به این صورت استفاده می کنم
        jDateTime::checkdate($month,$day, $year)
        کلاس اصلی سالار رو کپی کردم و جایگزین کردم درست شد

        • خب اگه لطف کنید تغییرات و یه تست برای این متد بنویسید و رو گیت‌هاب مرج‌ریکوئست بفرستید ممنونتون می‌شم.

  5. سلام
    ببخشید سوال من به موضوع این پستتون ربطی نداره
    لاراول به درد سایت فروشگاهی می خوره ؟
    با لاراول چه نوع سایت هایی می شه نوشت

  6. سلام
    اول از همه بسیییییییییییییییییییار ممنون بابت ماژول

    من نیاز دارم ک تاریخ شمسی رو به میلادی و بلعکس تبدیل کنم؟ماژول همچین امکانی داره؟؟؟

  7. سلام، خیلی ممنون خیلی عالی کار میکنه. فقط یه سوال برای فارسی کردن اعداد چه کنیم؟ یه solution خوب و کلی واسه این قضیه هست؟ نه فقط صرفا واسه تاریخ، بطور کل برای اعداد. مرسی.

    • برای اینکار هم راه‌حل جاوااسکریپتی هست هم راه حل با php. تو این پکیج اگه پارامتر دوم متد format را مقدار true بدید بهتون خروجی با حروف و اعداد فارسی میده. و اگه منظورتون فارسی‌سازی اعداد تو جاهای دیگه س، میتونی از متد convertNumber توی کلاس jDateTime استفاده کنی.

    • بله اگه فرمتش رو بدید به میلادی میتونید تبدیلش کنید. کامنت ها رو بخونید چندبار اینو توضیح دادم

  8. ببخشید آیا امکان تبدیل این فرمت به میلادی به صورت دقیق (همراه با ساعت و ثانیه و ..) وجود داره؟؟۱۳۹۴-۰۸-۲۳ ۲۰:۱۴:۲۲

    • توی کامنت قبلی‌تون پاسخ دادم. زمان (ساعت – دقیقه – ثانیه) تو میلادی و شمسی هیچ تفاوتی نداره

  9. ممنون از زحمتی که کشیدید دوست خوبم ، من یه مشکل دارم و اون اینه که همه ی مراحل به درستی انجام شده ، و در کنترلر هم از use jDate استفاده شده ، اما باز هم با پیام Class jDate not found روبرو می شم ، در ظمن از لاراول ۵٫۱ استفاده می کنم…ممنون می شم اگه راهنمایی کنید…

  10. با توجه به مثال های آقای کابلی که متود parseFromFormat رو به طور استاتیک صدا زده ، باید تابع parseFromFormat در کلاس jDate هم استاتیک تعریف بشه که نشده…جهت اطلاع دوستان اگه به مشکل برخوردند یه وقت…

    • نمی‌دونم منظورتون کدوم مثال‌ها هستن ولی در مورد static بودن حق با شماست. اگه میتونید لطف کنید و یه pull-request بفرستید یا اینکه خودم وقت کنم درستش کنم

  11. با سلام من می خواستم تاریخ یک ماه بعد رو داشته باشم ولی وقتی می خواد برگردونه می گه ۴ هفته پیش.
    چرا؟؟

    • باشه رسیدگی می‌کنم ولی جای مطرح کردن این موضوع همون تو گیت‌هاب بود تا بقیه هم بتونن ببینن و کمک بکنن

  12. سلام
    چظوری تو ویو فرخوانی کنم و که تاریخ میلادی از پایگاه داده رو بهش بدم که با ساعت هست و تاریخ شمسی رو برگردونه؟
    با تشکر

    • این اررور واسه عملیات تبدیل نوعه. یعنی مثلا شما داری یه شی از کلاس jDate رو چاپ میکنی که اشتباهه این عمل.

  13. سلام و خشته نباشید
    تشکر بابت پست
    من بعد از استفاده تاریخ رو چهار روز عقب تر دارم یعنی الان که ۱۳ خرداد هستش من ۹ خرداد رو دارم .
    منطقه زمانی هم تهران ست کردم !

  14. کدوم ورژن پکیج رو نصب کردین؟
    ورژن لاراولتون چیه؟
    از چه متدی استفاده کردین؟ ورودی‌ها دقیقا چی بوده و خروجی دقیقا چی؟

  15. سلام به همه دوستان
    مشکل من در استفاده در Migration می باشد . چگونه می توانم کلاس jDate را در
    table->timestamps ست کنم؟ یا در کل لاراول (البته با آدرس دهی محل) ست کرد؟
    در لاراول ۵.۲
    ممنون

  16. سلام به همه دوستان
    بر اساس توضیحات گیت هاب
    // default timestamp is now
    $date = \Morilog\Jalali\jDate::forge();
    // OR
    $date = jdate(); منظور وارد کردن تو کدام قسمت لاراول است؟ که Timestamps
    لاراول به جلالی تغییر کند؟ ممنون میشم برای ما آماتورها توضیحات آسان بدهید.

    • این یه کتابخونه‌س و جایی از لاراول رو چه در دیتابیس چه در اپلیکیشن قرار نیست تغییر بده، تمام مثال‌هاش تو گیت‌هاب وجود داره. حداقل نیاز برای استفاده از این پکیج بلد بودن برنامه‌نویسی و فریمورک لاراوله.

  17. سلام بابت این ئکیج بسیار خوب ازتون تشکر میکنم ی سوالی داشتم چطور میتونم اولن روز ماه و اخرین روز ماه رو بدست بیارم؟

  18. سلام و تشکر بابت پکیج شمسی
    من دیدم دوستان به مشکل برخوردن توی هاست و این که با وجود نوع داده ی integer در دیتابیس ولی بازم تابع construct داده رو به صورت varchar میشناسه
    و باعث خطا در سیستم میشه
    (البته روی لوکال هاست به این مشکل بر نمیخورید )
    برای رفع خطا کافیه از Mutators استفاده کنید و اطلاعات را به integer تبدیل کنید
    مثال :
    function getstartAttribute()
    {

    $start = $this->startdate;
    settype($start, “integer”);
    return $start;
    }
    و برای ورود اطلاعات از MODELNAME->START استفاده کنید 🙂
    ————-
    و نکته ی دوم اگر با پیغام Not found Class مواجه شدید
    حتما از aliases استفاده کنید
    امیدوارم موفق باشید

  19. باسلام
    من با این متد ()jdate($Post->created_at)->ago میخام تاریخ منتشر شدن پست رو نشون بدم ولی اصلا درست کار نمیکنه … پستی که مثلا ۵ دقیقه پیش منتشر شده رو مینویسه “۳ ساعت”

    • من تست کردم، درست کار میکرد. باید ببینید ورژنی که استفاده میکنید چیه و اینکه مقدار دقیق $POST->created_at چیه

    • فکر میکنم مشکل شما از جای دیگه اس. لاراول یک تنظیم به توی فایل config/app.php داره با اسم timezone، حدث میزنم مشکل شما از اون باشه.

  20. سلام
    وقت بخیر
    چطوری می توانم created_at و… که خود Eloquent ایجااد می کند را به صورت شمسی دریافت کنم؟
    میشه در این مورد توضیح بدهید؟

    • بله امکانش هست.
      اول توی مدلتون اینو اضافه کنید:
      public $timestamps = false;

      بعد میتوند موقع ذخیره کردن اطلاعات اینجوری کار کنید:
      $model->created_at = تاریخ شمسی;

      یا اینکه میتونید متد boot مدل رو override کنید و این کارو به شکل اتوماتیک دربیارید

  21. بنده از همین کتابخونه استفاده کردم و میتونم زمان های ذخیره شده در دیتا بیس را به فارسی تبدیل کنم ولی بنده میخواهم به طور پیش فرض وقتی میخواهم بر فرض یه پست را داخل دیتا بیس ذخیره کنم این کتابخانه زمان های created_at را در دیتابیس به شمسی ذخیره کنم ایا این امکانش هست یا خیر؟اگر جوابی برای این سوالم بود ممنون میشم کمکم کنید؟اگه امکانش بود به ایمیل بنده جواب بدید.

    • بله امکانش هست.
      اول توی مدلتون اینو اضافه کنید:
      public $timestamps = false;

      بعد میتوند موقع ذخیره کردن اطلاعات اینجوری کار کنید:
      $model->created_at = تاریخ شمسی;

      یا اینکه میتونید متد boot مدل رو override کنید و این کارو به شکل اتوماتیک دربیارید

  22. سلام
    من تاریخ رو به صورت میلادی ذخیره میکنم.
    حالا داده ها رو در سمت ویو دارم و می خوام رو داده ها که foreach زدم وقتی به داده تاریخ رسید اون رو تبدیل به جلاالی کنم.
    امکانش هست؟ در واقع می خوام از تبدیل تاریخ رو در سمت view انجام بدم.
    امکان پذیر هست؟

    • بله امکانش هست. در اصل این پکیج هم برای همین کاره شما میتونید از فانکشن jdate() برای این منظور استفاده کنید. اگه مستنداتو تو گیت‌هاب بخونید کامل متوجه خواهید شد.

  23. سلام با تشکر از پست مفیدتان
    فقط یک سوال
    من میخواهم مقدار created_at, updated_at که در دیتابیس ذخیره میشود را به شمسی تبدیل کنم، ممنون میشوم اگر راهنمایی کنید

    • اگه همین کامنت‌ها یا داکیومنت خود پکیج رو بخونید کاملا متوجه میشید که چطور باید این کارو بکنید.

  24. درود
    عالی بود
    برای datepicker هم کاری انجام شده؟
    می تونیم همین رو استفاده کنیم برای فارسی کردن datepicker تو بوت استرپ؟

    • datepicker توی bootstrap با جاوااسکرپیت نوشته شده و با توجه به کتابخونه‌ یا فریمورکی که دارید استفاده میکنید، گزینه فارسی هم اغلب موجوده. این پکیج ربطی به datepicker bootstrap نداره.

  25. سلام
    ایراد این پکیج در نمایش یک ماه بعد و یکسال بعد هستش که ممکنه بعضی روزها رو یک روز پیش یا پس نمایش بده.
    در تاریخ میلادی درسته، ولی در شمسی نه.
    $date = jDate::forge(‘+1 month’)->time();
    print_r(date(‘Y-m-d’,$date));echo “”;

    • دلیلش اینه کلا داره بر اساس تاریخ میلادی محاسبات انجام میشه و تنها نمایش تاریخ به شمسیه. شما وقتی یکسال به تاریخ اضافه میکنید، دارید یک سال به تاریخ میلادی اضافه میکنید و نه شمسی و با توجه به اختلاف تاریخ در سال‌های کبیسه و غیرکبیسه تاریخ به این صورت نمایش داده میشه.

  26. سلام دوستان من میخام این کار رو بکنم که تاریخی رو در محدوده دو تاریخ سرچ کنم .
    یا بگم یک روز بعد از تاریخ فعلی و یک روز قبل از تاریخ فعلی
    چجوری باید تاریخ رو ذخیره کرد ؟ توی دیتابیس اگه string ذخیره کنیم مشکلی پیش میاد برا این کارا ؟ باید حتما به میلادی ذخیره کنیم ؟ یا اگه فارسی هم ذخیره کردیم طوری میشه ؟

  27. من تونستم با لاراویل ۵٫۲ با موفقیت نصب کنم. عالی بود دست تون درد نکنه.

  28. سلام من میخام یک datetimepicker داشته باشم .
    بهترینش که هم ظاهر خوبی داشته باشه هم کاارایی کدومه ؟
    ممنون

  29. سلام
    \Morilog\Jalali\jDatetime::createDatetimeFromFormat بر روی لوکال جواب میده ولی روی سرور ارور not found میده.
    با aliases هم تست کردم ولی جواب نداد.
    ممنون میشم راهنمایی کنید.

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *