|
|
|
| Как можно узнать текущую дату по исламскому календарю с точностью до дня?
Хиджра (т.е начало исламского календаря) начинается с 16 июля 622 года.
Год можно с погрешностью в один можно вычеслить так
date("Y") - 622 + ((date("Y") - 622) / 32);
| , но на счет полной даты с месяцем и числом ничего придумать не могу.
Кто что может предложить? | |
|
|
|
|
|
|
|
для: Unknown
(27.12.2009 в 19:35)
| | Microsoft в своих продуктах использует т.н. "Кувейтский алгоритм", но о подробностях алгоритма ниче не пишет :( | |
|
|
|
|
|
|
|
для: UnKnown
(27.12.2009 в 19:55)
| | Спасибо всем :)
Разобрался. | |
|
|
|
|
|
|
|
для: Unknown
(28.12.2009 в 00:22)
| | Получилось вот что
<?php
define("HIJRIEPOCH", 227015);
function divf($x, $y)
{
return( floor($x / $y) );
}
function h_leapyear($year)
{
if ( abs(((11 * $year) + 14) % 30) < 11 )
return(1);
else
return(0);
}
function h_numdays($month, $year)
{
if ((($month % 2) == 1) || (($month == 12) && h_leapyear($year)))
return(30);
else
return(29);
}
function h_absolute($day, $month, $year)
{
return($day
+ (29 * ($month - 1))
+ divf($month, 2)
+ (354 * ($year - 1))
+ divf((3 + (11 * $year)), 30)
+ HIJRIEPOCH - 1);
}
function h_date($day, $month, $year)
{
$abs_date = $error_fill = $days_before = 0;
if ($year < 0)
$year++;
$abs_date = g_absolute($day, $month, $year);
if ($abs_date < HIJRIEPOCH)
{
$cdate['year'] = 0;
while ($abs_date <= h_absolute(1, 1, $cdate['year']))
$cdate['year']--;
}
else
{
$cdate['year'] = divf(($abs_date - HIJRIEPOCH - 1), 355);
while ($abs_date >= h_absolute(1, 1, $cdate['year']+1))
$cdate['year']++;
}
$cdate['month'] = 1;
while ($abs_date > h_absolute(h_numdays($cdate['month'], $cdate['year']),
$cdate['month'],
$cdate['year']))
$cdate['month']++;
$cdate['day'] = ($abs_date - h_absolute(1, $cdate['month'], $cdate['year']) + 1);
if ($cdate['year'] <= 0)
{
$cdate['year'] = (($cdate['year'] - 1) * -1);
}
$cdate['weekday'] = abs($abs_date % 7);
return $cdate;
};
function g_numdays($month, $year)
{
$y = abs($year);
switch ($month)
{
case 2:
if ( ((($y % 4) == 0) && (($y % 100) != 0)) || (($y % 400) == 0) )
return(29);
else
return(28);
case 4:
case 6:
case 9:
case 11: return(30);
default: return(31);
}
}
function g_absolute($day, $month, $year)
{
$N = $day;
for ($m = $month - 1; $m > 0; $m--)
$N += g_numdays($m, $year);
return($N
+ 365 * ($year - 1)
+ divf(($year - 1), 4)
- divf(($year - 1), 100)
+ divf(($year - 1), 400));
}
print_r(h_date(28,12,2009));
?>
|
| |
|
|
|