Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр 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($month2)
          + (
354 * ($year 1))
          + 
divf((+ (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(11$cdate['year']))
         
$cdate['year']--;
   }
   else
   {
      
$cdate['year'] = divf(($abs_date HIJRIEPOCH 1), 355);
      while (
$abs_date >= h_absolute(11$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 Яндекс.Метрика Яндекс цитирования