April 2026
gregorian()Work with Gregorian, Jalali and Hijri dates in PHP. Convert, format and calculate through one consistent API—without changing the original value.
composer require eram/daynum:^1.0@betaA DATE, IN TRANSLATION
April 2026
gregorian()Farvardin 1405
jalali()Shawwal 1447
hijri()2026-04-08One shared date value
use Eram\Daynum\CivilDateTime;
$date = CivilDateTime::fromGregorian(2026, 4, 8);
$date->gregorian()->format('Y/m/d'); // 2026/04/08
$date->jalali()->format('Y/m/d'); // 1405/01/19
$date->hijri()->format('Y/m/d'); // 1447/10/20
$date->jalali()->withLocale('fa')->withDigits('persian')
->format('l j F Y'); // چهارشنبه ۱۹ فروردین ۱۴۰۵March 2026
gregorian()Farvardin 1405
jalali()Shawwal 1447
hijri()2026-03-21One shared date value
use Eram\Daynum\CivilDateTime;
$date = CivilDateTime::fromGregorian(2026, 3, 21);
$date->gregorian()->format('Y/m/d'); // 2026/03/21
$date->jalali()->format('Y/m/d'); // 1405/01/01
$date->hijri()->format('Y/m/d'); // 1447/10/02
$date->jalali()->withLocale('fa')->withDigits('persian')
->format('l j F Y'); // شنبه ۱ فروردین ۱۴۰۵September 2026
gregorian()Shahrivar 1405
jalali()Rabiʻ II 1448
hijri()2026-09-22One shared date value
use Eram\Daynum\CivilDateTime;
$date = CivilDateTime::fromGregorian(2026, 9, 22);
$date->gregorian()->format('Y/m/d'); // 2026/09/22
$date->jalali()->format('Y/m/d'); // 1405/06/31
$date->hijri()->format('Y/m/d'); // 1448/04/11
$date->jalali()->withLocale('fa')->withDigits('persian')
->format('l j F Y'); // سهشنبه ۳۱ شهریور ۱۴۰۵Choose a date to see results generated with Daynum 1.0.0-beta.4. These examples do not run PHP in your browser.
BEYOND CONVERSION
Shahrivar has 31 days. Mehr has 30. Add a Jalali month and Daynum uses the last valid day; the original date stays unchanged.
use Eram\Daynum\CivilDateTime;
$date = CivilDateTime::fromJalali(1405, 6, 31);
$next = $date->jalali()->addMonths(1);
$next->jalali()->format('Y/m/d'); // 1405/07/30
$date->jalali()->format('Y/m/d'); // 1405/06/312026-04-08Gregorian۱۴۰۵/۰۷/۳۱No day 31 in MehrnullParse a known format with Persian digits. tryParseExact returns null for an invalid date, so your form can ask the user to correct it.
use Eram\Daynum\Calendar\Jalali\JalaliView;
$date = JalaliView::tryParseExact('۱۴۰۵/۰۱/۱۹', 'Y/m/d');
$date?->gregorian()->format('Y-m-d'); // 2026-04-08
JalaliView::tryParseExact('۱۴۰۵/۰۷/۳۱', 'Y/m/d'); // nullTHE DETAILS MATTER
Choose the calendar and locale your application needs. Keep calendar calculations separate from elapsed-time calculations.
Seven bundled locales, including Persian, Dari and Arabic. Choose the digit style separately.
Umm al-Qura covers AH 1300–1600. Civil Hijri is a separate arithmetic calendar; Daynum never switches between them silently.
Daynum calculates civil time. For DST and elapsed time, use toDateTimeImmutable() or timestamps.
A QUICK COMPARISON
| Library | A good fit for | Approach |
|---|---|---|
| Daynum | Several calendars, one PHP API | Gregorian, Jalali and two Hijri calendars. Immutable values; no Composer runtime dependencies or ext-intl requirement. Civil-time arithmetic. Use native PHP for elapsed time across timezones. |
| morilog/jalali | A Jalali-focused application | An immutable Jalalian API for Shamsi dates, with conversion to and from Carbon and DateTime. A focused choice when Jalali is the calendar you need. |
| Carbon | Timezones and everyday date-time work | Extends PHP DateTime with expressive date arithmetic, relative parsing and localized output. CarbonImmutable is also available. Can sit alongside Daynum when your app needs both timezone and calendar operations. |
Based on the linked project documentation, reviewed October 8, 2026. This compares scope, not speed.
Moving from morilog/jalali? Read the migration guideInstall Daynum, choose a calendar and try it in your project.
Read the getting started guide