| 1 |
<?php |
| 2 |
|
| 3 |
namespace SyncBasalam\Utilities; |
| 4 |
|
| 5 |
defined('ABSPATH') || exit; |
| 6 |
|
| 7 |
class DateConverter |
| 8 |
{ |
| 9 |
public static function utcToJalaliDateTime(string $utcDatetime): ?string |
| 10 |
{ |
| 11 |
try { |
| 12 |
$utcDate = new \DateTime($utcDatetime, new \DateTimeZone('UTC')); |
| 13 |
$tehranDate = $utcDate->setTimezone(new \DateTimeZone('Asia/Tehran')); |
| 14 |
|
| 15 |
$g_y = (int) $tehranDate->format('Y'); |
| 16 |
$g_m = (int) $tehranDate->format('m'); |
| 17 |
$g_d = (int) $tehranDate->format('d'); |
| 18 |
|
| 19 |
[$jy, $jm, $jd] = self::gregorianToJalaliArray($g_y, $g_m, $g_d); |
| 20 |
|
| 21 |
return sprintf( |
| 22 |
'%04d/%02d/%02d - %s', |
| 23 |
$jy, |
| 24 |
$jm, |
| 25 |
$jd, |
| 26 |
$tehranDate->format('H:i:s') |
| 27 |
); |
| 28 |
} catch (\Exception $e) { |
| 29 |
error_log('Invalid date format: ' . $utcDatetime . ' - ' . $e->getMessage()); |
| 30 |
return null; |
| 31 |
} |
| 32 |
} |
| 33 |
|
| 34 |
public static function gregorianToJalaliArray(int $gy, int $gm, int $gd): array |
| 35 |
{ |
| 36 |
$g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]; |
| 37 |
$gy2 = ($gm > 2) ? ($gy + 1) : $gy; |
| 38 |
|
| 39 |
$days = 355666 + (365 * $gy) |
| 40 |
+ floor(($gy2 + 3) / 4) |
| 41 |
- floor(($gy2 + 99) / 100) |
| 42 |
+ floor(($gy2 + 399) / 400) |
| 43 |
+ $gd + $g_d_m[$gm - 1]; |
| 44 |
|
| 45 |
$jy = -1595 + (33 * floor($days / 12053)); |
| 46 |
$days %= 12053; |
| 47 |
$jy += 4 * floor($days / 1461); |
| 48 |
$days %= 1461; |
| 49 |
|
| 50 |
if ($days > 365) { |
| 51 |
$jy += floor(($days - 1) / 365); |
| 52 |
$days = ($days - 1) % 365; |
| 53 |
} |
| 54 |
|
| 55 |
$jm = ($days < 186) |
| 56 |
? 1 + floor($days / 31) |
| 57 |
: 7 + floor(($days - 186) / 30); |
| 58 |
|
| 59 |
$jd = 1 + (($days < 186) |
| 60 |
? ($days % 31) |
| 61 |
: (($days - 186) % 30)); |
| 62 |
|
| 63 |
return [$jy, $jm, $jd]; |
| 64 |
} |
| 65 |
} |