{"id":13763016,"url":"https://github.com/morilog/jalali","last_synced_at":"2025-10-05T21:31:35.771Z","repository":{"id":22569555,"uuid":"25910953","full_name":"morilog/jalali","owner":"morilog","description":"This Package helps developers to easily work with Jalali (Shamsi or Iranian) dates in php appliations, based on Jalali (Shamsi) DateTime class. ","archived":false,"fork":true,"pushed_at":"2024-08-19T12:49:35.000Z","size":143,"stargazers_count":859,"open_issues_count":15,"forks_count":110,"subscribers_count":16,"default_branch":"master","last_synced_at":"2024-09-20T13:43:46.366Z","etag":null,"topics":["composer","jalali","laratalks","laravel","morilog","persian-calendar","shamshi"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"miladr/jalali","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/morilog.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"issuehunt":"morilog"}},"created_at":"2014-10-29T08:16:38.000Z","updated_at":"2024-09-13T12:21:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/morilog/jalali","commit_stats":null,"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morilog%2Fjalali","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morilog%2Fjalali/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morilog%2Fjalali/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/morilog%2Fjalali/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/morilog","download_url":"https://codeload.github.com/morilog/jalali/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219867878,"owners_count":16554375,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["composer","jalali","laratalks","laravel","morilog","persian-calendar","shamshi"],"created_at":"2024-08-03T15:00:27.448Z","updated_at":"2025-10-05T21:31:35.753Z","avatar_url":"https://github.com/morilog.png","language":"PHP","funding_links":["https://issuehunt.io/r/morilog"],"categories":["پی اچ پی PHP","Packages"],"sub_categories":["Persian Tools"],"readme":"[![Build Status](https://travis-ci.org/morilog/jalali.svg?branch=master)](https://travis-ci.org/morilog/jalali)\nmorilog/jalali\n======\n- Jalali calendar is a solar calendar that was used in Persia, variants of which today are still in use in Iran as well as Afghanistan. [Read more on Wikipedia](http://en.wikipedia.org/wiki/Jalali_calendar) or see [Calendar Converter](http://www.fourmilab.ch/documents/calendar/).\n\n- Calendar conversion is based on the [algorithm provided by Kazimierz M. Borkowski](http://www.astro.uni.torun.pl/~kb/Papers/EMP/PersianC-EMP.htm) and has a very good performance.\n\n- CalendarUtils class was ported from [jalaali/jalaali-js](https://github.com/jalaali/jalaali-js)\n\n## Version 3 features\n- High human readable API\n- DateTime manipulating API\n- DateTime comparing API\n- Immutable\n\n## Installation Version 3.*\n\u003e If you are using version \u003c= 2.*, please read [old docs](https://github.com/morilog/jalali/blob/v2.3.0/README.md)\n#### Requirements:\n- `php \u003e= 7.0`\n\nRun the Composer update command\n\n    $ composer require morilog/jalali:3.*\n\n\u003ca name=\"basic-usage\"\u003e\u003c/a\u003e\n## Basic Usage\nIn the current version, I introduced `Jalalian` class for manipulating Jalali date time\n### Jalalian\nIn version \u003e= 1.1,  you can use `jdate()` instead of `Jalalian::forge()`;\n#### `now([$timestamp = null])`\n``` php\n// the default timestamp is Now\n$date = \\Morilog\\Jalali\\Jalalian::now()\n// OR\n$date = jdate();\n\n// pass timestamps\n$date = Jalalian::forge(1333857600);\n// OR\n$date = jdate(1333857600);\n\n// pass human readable strings to make timestamps\n$date = Jalalian::forge('last sunday');\n\n// get the timestamp\n$date = Jalalian::forge('last sunday')-\u003egetTimestamp(); // 1333857600\n\n// format the timestamp\n$date = Jalalian::forge('last sunday')-\u003eformat('%B %d، %Y'); // دی 02، 1391\n$date = Jalalian::forge('today')-\u003eformat('%A, %d %B %y'); // جمعه، 23 اسفند 97\n\n// get a predefined format\n$date = Jalalian::forge('last sunday')-\u003eformat('datetime'); // 1391-10-02 00:00:00\n$date = Jalalian::forge('last sunday')-\u003eformat('date'); // 1391-10-02\n$date = Jalalian::forge('last sunday')-\u003eformat('time'); // 00:00:00\n\n// get relative 'ago' format\n$date = Jalalian::forge('now - 10 minutes')-\u003eago() // 10 دقیقه پیش\n```\n\n#### Methods api\n---\n\n\n```php\npublic static function now(?\\DateTimeZone $timeZone = null): Jalalian\n\n$jDate = Jalalian::now();\n```\n\n---\n```php\npublic static function fromCarbon(Carbon $carbon): Jalalian\n\n$jDate = Jalalian::fromCarbon(Carbon::now());\n```\n\n---\n```php\npublic static function fromFormat(string $format, string $timestamp, ?\\DateTimeZone$timeZone = null): Jalalian \n\n$jDate = Jalalian::fromFormat('Y-m-d H:i:s', '1397-01-18 12:00:40');\n```\n\n\n---\n```php\npublic static function forge($timestamp, ?\\DateTimeZone $timeZone = null): Jalalian\n\n// Alias fo fromDatetime\n```\n\n---\n```php\npublic static function fromDateTime($dateTime, ?\\DateTimeZone $timeZone = null): Jalalian\n\n$jDate = Jalalian::fromDateTime(Carbon::now())\n// OR \n$jDate = Jalalian::fromDateTime(new \\DateTime());\n// OR\n$jDate = Jalalian::fromDateTime('yesterday');\n\n```\n\n\n---\n```php\npublic function getMonthDays(): int\n\n$date = (new Jalalian(1397, 1, 18))-\u003egetMonthDays() \n// output: 31\n```\n\n---\n```php\npublic function getMonth(): int\n\n$date = (new Jalalian(1397, 1, 18))-\u003egetMonth() \n// output: 1\n```\n\n---\n```php\npublic function isLeapYear(): bool\n\n$date = (new Jalalian(1397, 1, 18))-\u003eisLeapYear() \n// output: false\n\n```\n\n---\n```php\npublic function getYear(): int\n\n$date = (new Jalalian(1397, 1, 18))-\u003egetYear() \n// output: 1397\n```\n\n---\n```php\npublic function subMonths(int $months = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18))-\u003esubMonths(1)-\u003etoString() \n// output: 1396-12-18 00:00:00\n\n```\n\n---\n```php\npublic function subYears(int $years = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18))-\u003esubYears(1)-\u003etoString()\n// output: 1396-01-18 00:00:00\n```\n\n---\n```php\npublic function getDay(): int\n\n$date = (new Jalalian(1397, 1, 18))-\u003egetDay() \n// output: 18\n\n```\n\n---\n```php\npublic function getHour(): int\n\n$date = (new Jalalian(1397, 1, 18, 12, 0, 0))-\u003egetHour() \n// output: 12\n\n\n```\n\n---\n```php\npublic function getMinute(): int\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003egetMinute() \n// output: 10\n\n```\n\n---\n```php\npublic function getSecond(): int\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 45))-\u003egetSecond() \n// output: 45\n```\n\n---\n```php\npublic function getTimezone(): \\DateTimeZone\n\n// Get current timezone\n```\n\n---\n```php\npublic function addMonths(int $months = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003eaddMonths(1)-\u003eformat('m') \n// output: 02\n\n```\n\n---\n```php\npublic function addYears(int $years = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003eaddYears(1)-\u003eformat('Y') \n// output: 1398\n\n```\n\n---\n```php\npublic function getDaysOf(int $monthNumber = 1): int\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003egetDaysOf(1) \n// output: 31\n```\n\n---\n```php\npublic function addDays(int $days = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003eaddDays(1)-\u003eformat('d') \n// output: 18\n\n```\n\n---\n```php\npublic function toCarbon(): Carbon\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003etoCarbon()-\u003etoDateTimeString() \n// output: 2018-04-07 12:10:00\n```\n\n---\n```php\npublic function subDays(int $days = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003esubDays(10)-\u003eformat('d') \n// output: 08\n```\n\n---\n```php\npublic function addHours(int $hours = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003eaddHours(1)-\u003eformat('H') \n// output: 13\n\n```\n\n---\n```php\npublic function subHours(int $hours = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003esubHours(1)-\u003eformat('H') \n// output: 11\n\n```\n\n---\n```php\npublic function addMinutes(int $minutes = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003eaddMinutes(10)-\u003eformat('i') \n// output: 22\n\n```\n\n---\n```php\npublic function subMinutes(int $minutes = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003esubMinutes(10)-\u003eformat('i') \n// output: 02\n\n```\n\n---\n```php\npublic function addSeconds(int $secs = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003eaddSeconds(10)-\u003eformat('s') \n// output: 10\n\n```\n\n---\n```php\npublic function subSeconds(int $secs = 1): Jalalian\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003esubSeconds(10)-\u003eformat('i:s') \n// output: 11:40\n\n\n```\n\n---\n```php\npublic function equalsTo(Jalalian $other): bool\n\n$date = (new Jalalian(1397, 1, 18, 12, 10, 0))-\u003eequalsTo(Jalalian::now()) \n// output: false\n\n$date = Jalalian::now()-\u003eequalsTo(Jalalian::now()) \n// output: true\n\n```\n\n---\n```php\npublic function equalsToCarbon(Carbon $carbon): bool\n\n$date = Jalalian::now()-\u003eequalsToCarbon(Carbon::now())  \n// output: true\n```\n\n---\n```php\npublic function greaterThan(Jalalian $other): bool\n\n$date = Jalalian::now()-\u003egreaterThan(Jalalian::now()-\u003esubDays(1)))  \n// output: true\n```\n\n---\n```php\npublic function greaterThanCarbon(Carbon $carbon): bool\n\n$date = Jalalian::now()-\u003egreaterThanCarbon(Carbon::now()-\u003esubDays(1)))  \n// output: true\n\n```\n\n---\n```php\npublic function lessThan(Jalalian $other): bool\n\n$date = Jalalian::now()-\u003elessThan(Jalalian::now()-\u003eaddDays(1)))  \n// output: true\n\n```\n\n---\n```php\npublic function lessThanCarbon(Carbon $carbon): bool\n\n$date = Jalalian::now()-\u003elessThanCarbon(Carbon::now()-\u003eaddDays(1)))  \n// output: true\n\n```\n\n---\n```php\npublic function greaterThanOrEqualsTo(Jalalian $other): bool\n\n$date = Jalalian::now()-\u003egreaterThan(Jalalian::now()-\u003esubDays(1)))  \n// output: true\n\n```\n\n---\n```php\npublic function greaterThanOrEqualsToCarbon(Carbon $carbon): bool\n\n$date = Jalalian::now()-\u003egreaterThanOrEqualsToCarbon(Carbon::now()))  \n// output: true\n\n```\n\n---\n```php\npublic function lessThanOrEqualsTo(Jalalian $other): bool\n\n$date = Jalalian::now()-\u003elessThanOrEqualsTo(Jalalian::now()))  \n// output: true\n\n```\n\n---\n```php\npublic function lessThanOrEqualsToCarbon(Carbon $carbon): bool\n\n$date = Jalalian::now()-\u003elessThanOrEqualsToCarbon(Carbon::now()))  \n// output: true\n\n```\n\n---\n```php\npublic function isStartOfWeek(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisStartOfWeek()\n// output: true\n\n```\n---\n```php\npublic function getEndDayOfYear(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003egetEndDayOfYear()\n// output: 1397, 12, 29\n\n```\n---\n```php\npublic function getFirstDayOfMonth(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003egetFirstDayOfMonth()\n// output: 1397, 6, 1\n\n```\n---\n```php\npublic function getEndDayOfMonth(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003egetEndDayOfMonth()\n// output: 1397, 6, 30\n\n```\n---\n```php\npublic function isSaturday(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisSaturday()\n// output: true\n\n```\n\n---\n```php\npublic function isDayOfWeek(int $day): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisDayOfWeek(0)\n// output: true\n\n```\n\n---\n```php\npublic function isEndOfWeek(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisEndOfWeek()\n// output: false\n\n```\n\n---\n```php\npublic function isFriday(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisFriday()\n// output: false\n\n```\n\n---\n```php\npublic function isToday(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisToday()\n// output: (!maybe) true\n\n```\n\n---\n```php\npublic function isTomorrow(): bool\n\n$date = (new Jalalian(1397, 6, 25))-\u003eisTomorrow()\n// output: true\n\n```\n\n---\n```php\npublic function isYesterday(): bool\n\n$date = (new Jalalian(1397, 6, 23))-\u003eisYesterday()\n// output: true\n\n```\n\n---\n```php\npublic function isFuture(): bool\n\n$date = (new Jalalian(1397, 6, 26))-\u003eisFuture()\n// output: true\n\n```\n\n---\n```php\npublic function isPast(): bool\n\n$date = (new Jalalian(1397, 5, 24))-\u003eisPast()\n// output: true\n\n```\n\n---\n```php\npublic function toArray(): array\n$date = (new Jalalian(1397, 6, 24))-\u003etoArray()\n// output: (\n//     [year] =\u003e 1397\n//     [month] =\u003e 6\n//     [day] =\u003e 24\n//     [dayOfWeek] =\u003e 0\n//     [dayOfYear] =\u003e 179\n//     [hour] =\u003e 0\n//     [minute] =\u003e 0\n//     [second] =\u003e 0\n//     [micro] =\u003e 0\n//     [timestamp] =\u003e 1536969600\n//     [formatted] =\u003e 1397-06-24 00:00:00\n//     [timezone] =\u003e\n// )\n```\n\n---\n```php\npublic function getDayOfWeek(): int\n\n$date = (new Jalalian(1397, 5, 24))-\u003egetDayOfWeek()\n// output: 0\n\n```\n\n---\n```php\npublic function isSunday(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisSunday()\n// output: false\n\n```\n\n---\n```php\npublic function isMonday(): bool\n\n$date = (new Jalalian(1397, 6, 26))-\u003eisMonday()\n// output: true\n\n```\n\n---\n```php\npublic function isTuesday(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisTuesday()\n// output: false\n\n```\n\n---\n```php\npublic function isWednesday(): bool\n\n$date = (new Jalalian(1397, 6, 24))-\u003eisWednesday()\n// output: false\n\n```\n\n---\n```php\npublic function isThursday(): bool\n\n$date = (new Jalalian(1397, 6, 22))-\u003eisThursday()\n// output: true\n\n```\n\n---\n```php\npublic function getDayOfYear(): int\n\n$date = (new Jalalian(1397, 5, 24))-\u003egetDayOfYear()\n// output: 179\n\n```\n\n---\n```php\npublic function toString(): string\n$date = (new Jalalian(1397, 5, 24))-\u003eisPast()\n// output: 1397-05-24 00:00:00\n\n```\n\n---\n```php\npublic function format(string $format): string\n\n$date = (new Jalalian(1397, 5, 24))-\u003eformat('y')\n// output: 1397\n// see php date formats\n\n```\n\n---\n```php\npublic function __toString(): string\n\n// Alias of toString()\n```\n\n---\n```php\npublic function ago(): string\n\n```\n\n---\n```php\npublic function getTimestamp(): int\n\n```\n\n---\n```php\npublic function getNextWeek(): Jalalian\n\n```\n\n---\n```php\npublic function getNextMonth(): Jalalian\n\n```\n\n---\n\n### CalendarUtils\n---\n\n\n#### `checkDate($year, $month, $day, [$isJalali = true])`\n```php\n// Check jalali date\n\\Morilog\\Jalali\\CalendarUtils::checkDate(1391, 2, 30, true); // true\n\n// Check jalali date\n\\Morilog\\Jalali\\CalendarUtils::checkDate(2016, 5, 7); // false\n\n// Check gregorian date\n\\Morilog\\Jalali\\CalendarUtils::checkDate(2016, 5, 7, false); // true\n```\n---\n#### `toJalali($gYear, $gMonth, $gDay)`\n```php\n\\Morilog\\Jalali\\CalendarUtils::toJalali(2016, 5, 7); // [1395, 2, 18]\n```\n---\n#### `toGregorian($jYear, $jMonth, $jDay)`\n```php\n\\Morilog\\Jalali\\CalendarUtils::toGregorian(1395, 2, 18); // [2016, 5, 7]\n```\n---\n#### `strftime($format, [$timestamp = false, $timezone = null])`\n```php\nCalendarUtils::strftime('Y-m-d', strtotime('2016-05-8')); // 1395-02-19\n```\n---\n#### `createDateTimeFromFormat($format, $jalaiTimeString)`\n```php\n$Jalalian = '1394/11/25 15:00:00';\n\n// get instance of \\DateTime\n$dateTime = \\Morilog\\Jalali\\CalendarUtils::createDatetimeFromFormat('Y/m/d H:i:s', $Jalalian);\n\n```\n---\n#### `createCarbonFromFormat($format, $jalaiTimeString)`\n```php\n$Jalalian = '1394/11/25 15:00:00';\n\n// get instance of \\Carbon\\Carbon\n$carbon = \\Morilog\\Jalali\\CalendarUtils::createCarbonFromFormat('Y/m/d H:i:s', $Jalalian);\n\n```\n---\n#### `convertNumbers($string)`\n```php\n// convert latin to persian\n$date = \\Morilog\\Jalali\\CalendarUtils::strftime('Y-m-d', strtotime('2016-05-8')); // 1395-02-19\n\\Morilog\\Jalali\\CalendarUtils::convertNumbers($date); // ۱۳۹۵-۰۲-۱۹\n\n// convert persian to latin\n$dateString = \\Morilog\\Jalali\\CalendarUtils::convertNumbers('۱۳۹۵-۰۲-۱۹', true); // 1395-02-19\n\\Morilog\\Jalali\\CalendarUtils::createCarbonFromFormat('Y-m-d', $dateString)-\u003eformat('Y-m-d'); //2016-05-8\n```\n\n---\n#### `Carbon api-difference`\n\nYou can convert date/time to [briannesbitt/carbon](https://github.com/briannesbitt/carbon), thus being able to use it's [API](https://carbon.nesbot.com/docs/) to work with PHP DateTime class. \n\n##### [Difference](https://carbon.nesbot.com/docs/#api-difference) in months:\n\n```php\n// convert persian to Carbon\n$date = \\Morilog\\Jalali\\Jalalian::fromFormat('Y-m-d', \"1395-02-19\")-\u003etoCarbon(); \n// -\u003etoString() =\u003e Sun May 08 2016 00:00:00 GMT+0000\n\n// Add 4 months to Carbon\n$dateAdd4Months = $date-\u003eaddMonths(4);\n\n// Difference in months\n$dateAdd4Months-\u003eDiffInMonths($date); //4\n$dateAdd4Months-\u003efloatDiffInMonths($date); //4.0\n```\n\n---\n## Formatting ##\n\nFor help in building your formats, checkout the [PHP strftime() docs](http://php.net/manual/en/function.strftime.php).\n\n## Notes ##\n\nThe class relies on ``strtotime()`` to make sense of your strings, and ``strftime()`` to handle the formatting. Always check the ``time()`` output to see if you get false timestamps, it which case, means the class couldn't understand what you were asking it to do.\n\n## License ##\n- This bundle is created based on [Laravel-Date](https://github.com/swt83/laravel-date) by [Scott Travis](https://github.com/swt83) (MIT Licensed).\n- [Jalali (Shamsi) DateTime](https://github.com/sallar/CalendarUtils) class included in the package is created by [Sallar Kaboli](http://sallar.me) and is released under the MIT License.\n-  This package is created and modified by [Morteza Parvini](http://morilog.ir) for Laravel \u003e= 5 and is released under the MIT License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorilog%2Fjalali","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmorilog%2Fjalali","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmorilog%2Fjalali/lists"}