PHPackages                             mahdyaralipor/parsidate - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. mahdyaralipor/parsidate

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

mahdyaralipor/parsidate
=======================

A modern, zero-dependency PHP library for Jalali (Shamsi) date and time — with holidays, periods, and Persian digit support.

v1.1.0(1mo ago)42MITPHPPHP ^8.1

Since Feb 22Pushed 1mo agoCompare

[ Source](https://github.com/Mahdyaralipor/parsidate)[ Packagist](https://packagist.org/packages/mahdyaralipor/parsidate)[ Docs](https://github.com/Mahdyaralipor/parsidate)[ RSS](/packages/mahdyaralipor-parsidate/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (2)Versions (3)Used By (0)

[![ParsiDate Logo](https://raw.githubusercontent.com/Mahdyaralipor/parsidate/main/art/logo.svg)](https://raw.githubusercontent.com/Mahdyaralipor/parsidate/main/art/logo.svg)ParsiDate
=========

[](#parsidate)

**A modern, zero-dependency PHP library for Jalali (Shamsi) date and time.**

[![PHP](https://camo.githubusercontent.com/b7a697e071f8d9787ffc937dbecc5067619f2bdfaf327179e3a50d09d282a19f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e312b2d3737374242343f7374796c653d666c61742d737175617265266c6f676f3d706870266c6f676f436f6c6f723d7768697465)](https://php.net)[![Tests](https://camo.githubusercontent.com/ed4fadc2cba22dc0e4ec760c57f35f2b02217c313d27477182e78b053b942470/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d31333125323070617373696e672d627269676874677265656e3f7374796c653d666c61742d737175617265)](#)[![License](https://camo.githubusercontent.com/ac049ef4e7a0b7196b09add6ac2d4f180e544c0ac779c2b2ac2fd2723a209579/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75653f7374796c653d666c61742d737175617265)](LICENSE)[![Packagist](https://camo.githubusercontent.com/2372f00f9ae3f8c3d66a19ae3e546971c9776f75ff621ae1979c087bc28457ab/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6d616864796172616c69706f722f7061727369646174653f7374796c653d666c61742d737175617265)](https://packagist.org/packages/mahdyaralipor/parsidate)

[English](#english) · [فارسی](#%D9%81%D8%A7%D8%B1%D8%B3%DB%8C)

---

🇬🇧 English
----------

[](#-english)

### Why ParsiDate?

[](#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 &amp; Range** — iterate, filter, split date ranges
- ✅ **Persian digit support** — نمایش اعداد فارسی out of the box
- ✅ **PHP 8.1–8.5** tested and working

---

### Installation

[](#installation)

```
composer require mahdyaralipor/parsidate
```

---

### Quick Start

[](#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

[](#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

[](#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 &amp; Time

[](#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 &amp; Workdays

[](#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 &amp; Range

[](#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

[](#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

[](#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

[](#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؟

[](#چرا-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)

[](#بازه-زمانی-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 [Mahdyaralipor](https://github.com/Mahdyaralipor)

###  Health Score

37

—

LowBetter than 81% of packages

Maintenance86

Actively maintained with recent releases

Popularity6

Limited adoption so far

Community8

Small or concentrated contributor base

Maturity43

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 50% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~100 days

Total

2

Last Release

30d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/7316fbf66cdbdfa2eea2079578cf5edca69c6d050bec1e3384471bdb09288702?d=identicon)[Mahdyaralipor](/maintainers/Mahdyaralipor)

---

Top Contributors

[![mahdyaralipor](https://avatars.githubusercontent.com/u/142358745?v=4)](https://github.com/mahdyaralipor "mahdyaralipor (10 commits)")[![Mahdyaralipor](https://avatars.githubusercontent.com/u/142358745?v=4)](https://github.com/Mahdyaralipor "Mahdyaralipor (10 commits)")

---

Tags

datetimedatecalendarholidayJalaliiranpersianshamsiشمسیجلالیتاریخ

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/mahdyaralipor-parsidate/health.svg)

```
[![Health](https://phpackages.com/badges/mahdyaralipor-parsidate/health.svg)](https://phpackages.com/packages/mahdyaralipor-parsidate)
```

###  Alternatives

[hekmatinasser/verta

This Package helps developers to work with Jalali Datetime class for Laravel Framework PHP

657550.0k28](/packages/hekmatinasser-verta)[fisharebest/ext-calendar

Implementation of the Arabic (Hijri), French, Gregorian, Jewish, Julian and Persian (Jalali) calendars. Also provides a replacement for the PHP ext/calendar extension.

36513.6k11](/packages/fisharebest-ext-calendar)[symfony_persia/symfonyjdate

Jalali (Shamsi) DateTime for Symfony2, Supports year higher than 2038

1010.9k](/packages/symfony-persia-symfonyjdate)[p3ym4n/jdate

Date converter from Jalali to Georgian and vice versa. It has Carbon instance inside and it's Laravel friendly.

101.8k2](/packages/p3ym4n-jdate)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
