Не совсем понятен вопрос, в месяце 4 недели. Тут в конфе раньше давали вариант, может сгодится.
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Михаил Е. 21 октября 2003 г. 15:32
В ответ на: А кто встречал алгоритм расчета даты по известным месяцу, году, дню недели. Поделитесь плз отправлено allmaker 21 октября 2003 г. 14:26



/* Функция преобразования текущего дня в день, месяц, год.
File CodeDate.c Версия 02.02.*/
const unsigned char MonthDays [ 2 ] [ 12 ] =
{ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
//--------------------------------
// Определим високосность года (только для 21 века!!!)
unsigned char IsLeapYear ( unsigned char Y )
{
if ( Y % 4 ) return ( 0 );
return ( 1 );
} // IsLeapYear
//--------------------------------
// Функция преобразования текущего дня в день, месяц, год.
void DayToDate
( unsigned int D, unsigned char * Day, unsigned char * Mon, unsigned char * Yea )
{
unsigned char L;
D--;
// Определим год
*Yea = D * 4L / ( 365 * 4 + 1 );
// Оставим месяц и день
D = D - *Yea * 365 - ( *Yea - 1 ) / 4;
// Определим месяц
L = IsLeapYear ( *Yea );
*Mon = 0;
while ( D > MonthDays [ L ] [ *Mon ] )
{
D = D - MonthDays [ L ] [ *Mon ];
( *Mon )++;
}
( *Mon )++;
*Day = D;
} // DayToDate
//--------------------------------
// Функция преобразования даты (день, месяц, год ) в текущий день
unsigned int DateToDay ( unsigned char Day, unsigned char Mon, unsigned char Yea )
{
unsigned char i;
unsigned int D = 0;
// Сложим месяцы в текущем годе
if ( Mon - 1 )
{
if ( IsLeapYear ( Yea ) )
for ( i = 0; i < Mon - 1; i++ )
D += MonthDays [ 1 ] [ i ];
else
for ( i = 0; i < Mon - 1; i++ )
D += MonthDays [ 0 ] [ i ];
}
return ( Yea * 365 + ( Yea - 1 ) / 4 + D + Day + 1 );
// +1 образовалось от того, что 2000 год високосный
} // DatetoDay




Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru