mahdyaralipor/parsidate
Composer 安装命令:
composer require mahdyaralipor/parsidate
包简介
A modern, zero-dependency PHP library for Jalali (Shamsi) date and time — with holidays, periods, and Persian digit support.
README 文档
README
ParsiDate
A modern, zero-dependency PHP library for Jalali (Shamsi) date and time.
🇬🇧 English
Why ParsiDate?
Most existing Jalali libraries for PHP are either outdated, depend on deprecated functions like strftime(), tied to a specific framework, or have clunky APIs. ParsiDate is built from the ground up for modern PHP:
- ✅ Zero external dependencies — pure PHP 8.1+
- ✅ Immutable by default — no side-effects, no surprises
- ✅ Fluent, chainable API — similar feel to Carbon
- ✅ Full holiday support — official Iranian public holidays built-in (1400–1405+)
- ✅ Period & Range — iterate, filter, split date ranges
- ✅ Persian digit support — نمایش اعداد فارسی out of the box
- ✅ PHP 8.1–8.5 tested and working
Installation
composer require mahdyaralipor/parsidate
Quick Start
use ParsiDate\ParsiDate; use ParsiDate\ParsiDateTime; use ParsiDate\ParsiPeriod; // Today $today = ParsiDate::now(); // e.g. 1403/06/15 echo $today->format('l j M Y'); // شنبه 15 شهریور 1403 // Create & convert $nowruz = ParsiDate::create(1403, 1, 1); $greg = $nowruz->toGregorian(); // ['year'=>2024,'month'=>3,'day'=>20] // Parse $date = ParsiDate::parse('1403/06/15'); $date = ParsiDate::parse('۱۴۰۳/۰۶/۱۵'); // Persian digits supported // From Gregorian $date = ParsiDate::fromGregorian(2024, 3, 20);
Fluent Arithmetic
$date = ParsiDate::create(1403, 1, 1); $date->addDays(10); // 1403/01/11 $date->subMonths(2); // 1402/11/01 $date->addYears(1); // 1404/01/01 $date->startOfMonth(); // 1403/01/01 $date->endOfMonth(); // 1403/01/31 $date->startOfYear(); // 1403/01/01 $date->endOfYear(); // 1403/12/30 (leap year)
Formatting
$date = ParsiDate::create(1403, 6, 15); $date->format('Y/m/d'); // 1403/06/15 $date->format('j M Y'); // 15 شهریور 1403 $date->format('D، j F Y'); // شنبه، 15 Shahrivar 1403 $date->formatPersian('Y/m/d'); // ۱۴۰۳/۰۶/۱۵ // Available tokens // Y=year, m=month(pad), n=month, d=day(pad), j=day // M=Persian month name, F=English month name // D=Persian day name, l=English day name // L=leap(0/1), t=days in month, z=day of year
Date & Time
use ParsiDate\ParsiDateTime; $now = ParsiDateTime::now(); // 1403/06/15 14:30:00 $now->format('Y/m/d H:i:s'); // 1403/06/15 14:30:00 $now->formatPersian('Y/m/d H:i'); // ۱۴۰۳/۰۶/۱۵ ۱۴:۳۰ $dt = ParsiDateTime::create(1403, 6, 15, 22, 0, 0); $dt->addHours(3)->format('H:i'); // 01:00 (next day) $dt->startOfDay()->format('H:i:s'); // 00:00:00 $dt->endOfDay()->format('H:i:s'); // 23:59:59 // Timezone support $dt->inTimezone('UTC')->format('H:i');
Holidays & Workdays
$date = ParsiDate::create(1403, 1, 1); $date->isHoliday(); // true — Nowruz $date->holidayName(); // "جشن نوروز" $date->isWeekend(); // false (it's Wednesday) $date->isWorkday(); // false (holiday) // Working day navigation $date->nextWorkday(); // first workday after this date $date->previousWorkday(); // last workday before this date $date->addWorkdays(5); // 5 working days from now (skips weekends & holidays) $date->workdaysUntil($other); // count working days between two dates // Custom/updated holidays use ParsiDate\Holidays\HolidayChecker; HolidayChecker::setVariableHolidays(1406, [ [3, 15, 'تعطیل فرضی'], ]); // List holidays HolidayChecker::ofMonth(1403, 1); // all holidays in Farvardin 1403 HolidayChecker::ofYear(1403); // all holidays in 1403
Period & Range
use ParsiDate\ParsiPeriod; // Create a period $period = ParsiPeriod::create( ParsiDate::create(1403, 1, 1), ParsiDate::create(1403, 1, 31) ); // Or use shortcuts $period = ParsiPeriod::ofMonth(1403, 1); $period = ParsiPeriod::ofYear(1403); $period = ParsiPeriod::fromDate(ParsiDate::create(1403, 1, 1), 30); // 30 days // Info $period->days(); // 31 $period->countWorkdays(); // working days count $period->countHolidays(); // holidays count // Filter $period->toArray(); // all ParsiDate objects $period->workdays(); // only working days $period->holidays(); // only official holidays $period->fridays(); // only Fridays $period->byDayOfWeek(6); // all Saturdays (6=Sat) $period->filter(fn($d) => $d->day() % 2 === 0); // custom filter // Contains & overlap $period->contains($date); // bool $period->overlap($other); // ParsiPeriod|null // Split $period->splitByDays(7); // weekly chunks $period->splitByMonth(); // monthly chunks // Iterable — use in foreach! foreach ($period as $date) { echo $date->format('Y/m/d') . PHP_EOL; }
Comparison
$a = ParsiDate::create(1403, 1, 1); $b = ParsiDate::create(1403, 6, 1); $a->before($b); // true $a->after($b); // false $a->equalTo($b); // false $a->between($start, $end); // true/false $a->diffInDays($b); // 153 $a->diffInMonths($b); // 5
Hijri (Islamic) Date Conversion
$date = ParsiDate::create(1403, 1, 1); // Nowruz 1403 $hijri = $date->toHijri(); // Accessors $hijri->year(); // 1445 $hijri->month(); // 9 $hijri->day(); // 10 // Month names $hijri->monthName(); // رمضان $hijri->monthNameLatin(); // Ramadan // Formatting $hijri->format('j F Y'); // 10 رمضان 1445 $hijri->format('Y/m/d'); // 1445/09/10 $hijri->formatPersian('j F Y'); // ۱۰ رمضان ۱۴۴۵ $hijri->formatPersian('Y/m/d'); // ۱۴۴۵/۰۹/۱۰ // Available format tokens // Y=4-digit year, y=2-digit year // m=month(padded), n=month(no pad) // d=day(padded), j=day(no pad) // F=Arabic month name, M=Latin month name // Convert to array / JSON $hijri->toArray(); // ['year' => 1445, 'month' => 9, 'day' => 10] $hijri->toJson(); // {"year":1445,"month":9,"day":10} (string) $hijri; // "1445/09/10"
Note: Uses the arithmetic (tabular) Hijri calendar — the standard civil calendar used across the Islamic world. Astronomical/observational calendars may differ by ±1–2 days.
Contributing
Contributions, bug reports, and pull requests are welcome!
git clone https://github.com/Mahdyaralipor/parsidate.git
cd parsidate
composer install
./vendor/bin/phpunit tests/
🇮🇷 فارسی
چرا ParsiDate؟
اکثر کتابخانههای موجود برای تاریخ جلالی در PHP یا قدیمی هستن، یا به توابع deprecated مثل strftime() وابستهان، یا به یه فریمورک خاص نیاز دارن. ParsiDate از صفر برای PHP مدرن نوشته شده:
- ✅ بدون وابستگی خارجی — PHP خالص 8.1+
- ✅ Immutable — بدون side-effect
- ✅ API روان و chainable — شبیه Carbon
- ✅ تعطیلات رسمی — تعطیلات ایران از 1400 تا 1405+ به صورت built-in
- ✅ Period و Range — پیمایش، فیلتر و تقسیم بازه زمانی
- ✅ اعداد فارسی — پشتیبانی کامل از ارقام فارسی
- ✅ PHP 8.1 تا 8.5 — تستشده
نصب
composer require mahdyaralipor/parsidate
شروع سریع
use ParsiDate\ParsiDate; // امروز $today = ParsiDate::now(); echo $today->format('l j M Y'); // شنبه 15 شهریور 1403 // ساخت و تبدیل $nowruz = ParsiDate::create(1403, 1, 1); $greg = $nowruz->toGregorian(); // ['year'=>2024,'month'=>3,'day'=>20] // Parse با اعداد فارسی $date = ParsiDate::parse('۱۴۰۳/۰۶/۱۵');
تعطیلات و روزهای کاری
$date = ParsiDate::create(1403, 1, 1); $date->isHoliday(); // true — نوروز $date->holidayName(); // "جشن نوروز" $date->isWeekend(); // false $date->isWorkday(); // false $date->nextWorkday(); // اولین روز کاری بعد $date->addWorkdays(5); // ۵ روز کاری بعد (جمعهها و تعطیلات skip) $date->workdaysUntil($other); // تعداد روزهای کاری بین دو تاریخ
بازه زمانی (Period)
use ParsiDate\ParsiPeriod; $period = ParsiPeriod::ofMonth(1403, 1); // کل فروردین ۱۴۰۳ $period->days(); // ۳۱ $period->countWorkdays(); // روزهای کاری $period->workdays(); // لیست ParsiDate های کاری $period->fridays(); // همه جمعهها $period->holidays(); // همه تعطیلات رسمی // قابل استفاده در foreach foreach ($period as $date) { echo $date->format('Y/m/d'); }
تبدیل به تاریخ هجری قمری
$date = ParsiDate::create(1403, 1, 1); // نوروز ۱۴۰۳ $hijri = $date->toHijri(); // دسترسی به اجزا $hijri->year(); // 1445 $hijri->month(); // 9 $hijri->day(); // 10 // نام ماه $hijri->monthName(); // رمضان $hijri->monthNameLatin(); // Ramadan // فرمتبندی $hijri->format('j F Y'); // 10 رمضان 1445 $hijri->format('Y/m/d'); // 1445/09/10 $hijri->formatPersian('j F Y'); // ۱۰ رمضان ۱۴۴۵ $hijri->formatPersian('Y/m/d'); // ۱۴۴۵/۰۹/۱۰ // خروجی آرایه / JSON $hijri->toArray(); // ['year' => 1445, 'month' => 9, 'day' => 10] $hijri->toJson(); // {"year":1445,"month":9,"day":10} (string) $hijri; // "1445/09/10"
توجه: این تبدیل از تقویم هجری جدولی (حسابی) استفاده میکند — همان تقویمی که در ایران و اکثر کشورهای اسلامی برای مقاصد مدنی بهکار میرود. تقویم هجری نجومی (رؤیت هلال) ممکن است ۱ تا ۲ روز متفاوت باشد.
لایسنس
این پروژه تحت لایسنس MIT منتشر شده است.
Made with ❤️ by Mahdyaralipormahdyaralipor/parsidate 适用场景与选型建议
mahdyaralipor/parsidate 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 2 次下载、GitHub Stars 达 4, 最近一次更新时间为 2026 年 02 月 22 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「date」 「calendar」 「datetime」 「persian」 「Jalali」 「holiday」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 mahdyaralipor/parsidate 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 mahdyaralipor/parsidate 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 mahdyaralipor/parsidate 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Tools to convert between .NET and PHP date formats
Time provider, providing consistent current date, time, datetime and timezone across the request.
A modern PHP library for generating iCalendar v2.0 events
Adds the EDTF data type to Wikibase
Datetime helpers for timezone handling
A custom Doctine DBAL type to use PHP DateTime objects set to the system's default timezone.
统计信息
- 总下载量: 2
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 4
- 点击次数: 36
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2026-02-22