62 lines
1.8 KiB
PHP
62 lines
1.8 KiB
PHP
<?php
|
|
|
|
namespace App\Support;
|
|
|
|
use Carbon\Carbon;
|
|
use Morilog\Jalali\Jalalian;
|
|
use Throwable;
|
|
|
|
class JalaliHelper
|
|
{
|
|
public static function fromDateTime($value): ?Jalalian
|
|
{
|
|
if ($value === null || $value === '' || $value === '0000-00-00' || str_starts_with((string) $value, '0000-00-00')) {
|
|
return null;
|
|
}
|
|
|
|
try {
|
|
$carbon = $value instanceof Carbon ? $value->copy() : Carbon::parse($value);
|
|
|
|
// سال میلادی نامعتبر / خیلی قدیمی → تبدیل شمسی ممکن است year=0 بدهد
|
|
if ($carbon->year < 1621 || $carbon->year > 2500) {
|
|
return null;
|
|
}
|
|
|
|
$jalali = Jalalian::fromCarbon($carbon);
|
|
if ($jalali->getYear() < 1000 || $jalali->getYear() > 3000) {
|
|
return null;
|
|
}
|
|
|
|
return $jalali;
|
|
} catch (Throwable $e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static function format($value, string $format = 'Y/m/d', string $fallback = '-'): string
|
|
{
|
|
$jalali = self::fromDateTime($value);
|
|
|
|
return $jalali ? $jalali->format($format) : $fallback;
|
|
}
|
|
|
|
/** تاریخ میلادی امن به صورت Y-m-d */
|
|
public static function toGregorianDate($value, string $fallback = ''): string
|
|
{
|
|
if ($value === null || $value === '' || str_starts_with((string) $value, '0000-00-00')) {
|
|
return $fallback;
|
|
}
|
|
|
|
try {
|
|
$carbon = $value instanceof Carbon ? $value->copy() : Carbon::parse($value);
|
|
if ($carbon->year < 1000 || $carbon->year > 3000) {
|
|
return $fallback;
|
|
}
|
|
|
|
return $carbon->format('Y-m-d');
|
|
} catch (Throwable $e) {
|
|
return $fallback;
|
|
}
|
|
}
|
|
}
|