Jalali — تقویم شمسی
یک شیء تاریخ شمسی ، با پیادهسازی مستقل بر پایهٔ Carbon — با امکان تبدیل به/از Carbon و Hijri، و مدیریت تایمزون ذخیرهسازی و نمایش بهصورت پویا.
نصب و راهاندازی
ماژول Jalali بخشی از dornica/doravel است و نیازی به نصب جداگانه ندارد.
use Dornica\Foundation\Jalali\Facade\Jalali;
// یا کلاس
use Dornica\Foundation\Jalali\Jalali;
نکته: تابع کمکی سراسری
jalali()توسط این پکیج تأمین میشود (جایگزین تابع کمکی همنام در مجموعهٔ پکیجها؛vertaوverta()بدون تغییر باقی میمانند).
متدها
now()
تاریخ شمسی لحظهٔ جاری:
$date = Jalali::now();
$date = Jalali::now('Asia/Tehran');
$date = Jalali::now(new DateTimeZone('Asia/Tehran'));
// با تابع کمکی
$date = jalali();
today / tomorrow / yesterday
$date = Jalali::today();
$date = Jalali::tomorrow();
$date = Jalali::yesterday();
parse()
ساخت از رشتهٔ شمسی — فرمتهای مجاز: Y-m-d یا Y/m/d با یا بدون زمان:
$date = Jalali::parse('1403-05-14');
$date = Jalali::parse('1403/05/14');
$date = Jalali::parse('1403/05/14 13:30:00');
// با تابع کمکی
$date = jalali('1403/05/14');
jalali() خودداری کنیدparse() — و در نتیجه jalali('...') — رشته را همیشه شمسی فرض میکند و هیچ تشخیصی روی میلادی بودن انجام نمیدهد. نکتهٔ مهمتر اینکه در بیشتر موارد خطایی صادر نمیشود و تاریخ نادرست بازگردانده میشود:
// ❌ نادرست و بدون خطا — «2026-07-15» عیناً شمسی خوانده میشود
jalali('2026-07-15')->format('Y/m/d'); // 2026/07/15 (مقدار صحیح: 1405/04/24)
// ❌ بروز خطا قطعی نیست و تنها در برخی حالتها رخ میدهد
jalali('2026-07-31');
// InvalidJalaliDateException: Invalid Jalali date: 2026/7/31
// (به دلیل اینکه روز 31 در ماه 7 شمسی وجود ندارد، نه به دلیل میلادی بودن سال)
// ✅ شیء تاریخ را مستقیماً ارسال کنید
jalali($user->created_at);
jalali(new DateTime('2026-07-31'));
// ✅ یا در صورتی که تنها اجزای میلادی در دسترس است
Jalali::createGregorian(2026, 7, 31);
رایجترین موقعیت بروز این خطا زمانی است که تاریخ ابتدا با format() به رشته تبدیل شده و سپس همان رشته به jalali() ارسال میشود:
// ❌ تبدیل غیرضروری به رشته و بازگردانی مجدد
$key = $date->format('Y-m-d');
$label = jalali($key)->format('m/d');
// ✅ تبدیل را روی خود شیء تاریخ انجام دهید
$key = $date->format('Y-m-d');
$label = jalali($date)->format('m/d');
تابع کمکی jalali() برای Carbon، DateTimeInterface، Hijri و timestamp عددی مسیر صحیح را بهصورت خودکار انتخاب میکند؛ تنها رشته است که شمسی فرض میشود.
create()
ساخت از اجز ای شمسی:
$date = Jalali::create(1403, 5, 14);
$date = Jalali::create(1403, 5, 14, 13, 30, 0, 'Asia/Tehran');
createGregorian()
ساخت از اجزای میلادی:
$date = Jalali::createGregorian(2024, 8, 4);
$date = Jalali::createGregorian(2024, 8, 4, 13, 30, 0, 'Asia/Tehran');
fromCarbon()
ساخت از Carbon:
$date = Jalali::fromCarbon(Carbon::now());
// با تابع کمکی
$date = jalali(Carbon::now());
fromHijri()
ساخت از Hijri — تبدیل تاریخ قمری به شمسی:
$date = Jalali::fromHijri(hijri('1447-09-15'));
// با تابع کمکی
$date = jalali(hijri('1447-09-15'));
زنجیرهٔ تبدیل:
Hijri (قمری)←Carbon (میلادی)←Jalali (شمسی)