Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Узнать дату по исламскому календарю
 
 автор: Unknown   (27.12.2009 в 19:35)   письмо автору
 
 

Как можно узнать текущую дату по исламскому календарю с точностью до дня?
Хиджра (т.е начало исламского календаря) начинается с 16 июля 622 года.
Год можно с погрешностью в один можно вычеслить так
date("Y") - 622 + ((date("Y") - 622) / 32); 
, но на счет полной даты с месяцем и числом ничего придумать не могу.
Кто что может предложить?

  Ответить  
 
 автор: UnKnown   (27.12.2009 в 19:55)   письмо автору
 
   для: Unknown   (27.12.2009 в 19:35)
 

Microsoft в своих продуктах использует т.н. "Кувейтский алгоритм", но о подробностях алгоритма ниче не пишет :(

  Ответить  
 
 автор: Unknown   (28.12.2009 в 00:22)   письмо автору
 
   для: UnKnown   (27.12.2009 в 19:55)
 

Спасибо всем :)
Разобрался.

  Ответить  
 
 автор: Unknown   (28.12.2009 в 00:30)   письмо автору
 
   для: 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));

?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования