ну и тут может чего полезное найдешь
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

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


#include "SP8890_gpubl.h"
#include "dvb_time.h"
/*
typedef struct {
u8_t sec;
u8_t minute;
u8_t hour;
u16_t year;
u8_t month;
u8_t day;
u16_t MJD_TIME;
} Time_t;
*/


void
get_hhmmss_from_utc(u8_t* pt,Time_t *ttime)
{
u8_t tmp = *pt++;
ttime->hour = 10 * (tmp >> 4) + (tmp & 0x0F); tmp = *pt++;
ttime->minute = 10 * (tmp >> 4) + (tmp & 0x0F); tmp = *pt++;
ttime->sec = 10 * (tmp >> 4) + (tmp & 0x0F);
}

/******************************************************************************
* DESCRIPTION:
* convert Date (year/month/day) to long days
*****************************************************************************/
u32_t DateToLong(Time_t *ttime)
{
u8_t month,day;
u16_t year;
u32_t c,ya;

month = ttime->month;
day = ttime->day;
year = ttime->year;

if(month > 2)
month -= 3;
else {
month += 9;
year--;
}

c = year / 100;
ya = year - 100 * c;

//return (146097 * c)/4 + (1461 * ya)/4 + (153 * month + 2)/5 + day + 1721119;
return (146097 * c)/4 + (1461 * ya)/4 + (153 * month + 2)/5 + day;
}
/******************************************************************************
* DESCRIPTION:
* convert to long days to Date (year/month/day)
*****************************************************************************/
void LongToDate(u32_t j,Time_t *ttime)
{
u32_t d,m,y;
// j -= 1721119;
y = (4*j-1) / 146097;

d = (4 * j - 1 - 146097 * y) / 4l;
j = (4 * d + 3) / 1461;

d = (4 * d + 7 - 1461 * j) / 4l;
m = (5 * d - 3) / 153;

d = (5 * d + 2 - 153 * m) / 5l;
y = 100 * y + j;

if (m < 10)
m += 3;
else {
m -= 9;
y++;
}

ttime->month = m;
ttime->year = y;
ttime->day = d;
};

/******************************************************************************
* DESCRIPTION:
* inc UTC time on X seconds;
*****************************************************************************/
u32_t
TimeToLong(Time_t *ttime)
{
return (ttime->hour*60l+ttime->minute)*60l+ttime->sec;
}

void
LongToTime(u32_t t, Time_t *ttime)
{
u32_t h,m,s;
s=t%60l; t/=60l;
m=t%60l;
h=t/60l;
ttime->hour=h;
ttime->minute=m;
ttime->sec=s;
};



u8_t WDfromMJD(u16_t mjd)
{
return( (mjd + 2 ) % 7 + 1);

}

void MJDtoYMD(Time_t * time)
{
float a;
u16_t Y,_Y;
u8_t M,_M,D,K;


a = time -> MJD_TIME;

_Y = (u16_t)((a - 15078.2)/365.25);
_M = (u8_t)((a - 14956.1 - (u32_t)((float)_Y * 365.25))/30.6001);
time->day = (u8_t)((u32_t)a - 14956 - (u32_t)((float)_Y * 365.25) - (u32_t)((float)_M * 30.6001));

if ((_M == 14) || (_M == 15))
K = 1;
else K = 0;

time->year = (_Y + K);
time->month = _M - 1 - K * 12;
}


void YMDtoMJD(Time_t * time)
{
u8_t L = 0;

if ((time->month == 1) || (time->month == 2))
L = 1;
time->MJD_TIME =
(u16_t)(14956 + time->day + (u32_t)((time->year - 1900 - L)*365.25) + (u32_t)((time->month + 1 + L*12)*30.6001));

}

u32_t mjd_to_long(u16_t mjd)
{
Time_t ttime;

ttime.MJD_TIME = mjd;

MJDtoYMD(&ttime);
return DateToLong(&ttime);
}


void convert_utc(u8_t *ptr,Time_t * time,u32_t *lsec)
{
Time_t ttime;
u32_t l_sec,l_date;

ttime.MJD_TIME = GET_U16(ptr); ptr+=2;
MJDtoYMD(&ttime);
ttime.year +=1900;
get_hhmmss_from_utc(ptr,&ttime);

l_sec = DateTime_ToLong(&ttime);

if (time != NULL)
*time = ttime;

if (lsec != NULL)
*lsec = l_sec;

}

/******************************************************************************
* DESCRIPTION:
* convert Date and Time to long seconds
*****************************************************************************/
u32_t DateTime_ToLong(Time_t *ttime)
{
u8_t month;
u16_t year;
u32_t c,ya;
u32_t res;

month = ttime->month;
year = ttime->year;

if(month > 2)
month -= 3;
else {
month += 9;
year--;
}

c = year / 100;
ya = year - 100 * c;
res = (146097 * c)/4 + (1461 * ya)/4 + (153 * month + 2)/5 + ttime->day;

return (res - 720000) * 86400l + (ttime->hour * 60l + ttime->minute) * 60l + ttime->sec;
}
/******************************************************************************
* DESCRIPTION:
* convert long seconds to Date and Time
*****************************************************************************/
void LongTo_DateTime(u32_t j,Time_t *ttime)
{
u32_t d,m,y;
u32_t date,t;

date = j/86400l;
t = j - (date * 86400l);
date += 720000;

y = (4 * date - 1) / 146097;
d = (4 * date - 1 - 146097 * y) / 4l;

date = (4 * d + 3) / 1461;

d = (4 * d + 7 - 1461 * date) / 4l;
m = (5 * d - 3) / 153;

d = (5 * d + 2 - 153 * m) / 5l;
y = 100 * y + date;

if (m < 10)
m += 3;
else {
m -= 9;
y++;
}

ttime->month = m;
ttime->year = y;
ttime->day = d;

ttime->sec = t % 60l; t /= 60l;
ttime->hour = t / 60l;
ttime->minute = t % 60l;
};

/******************************************************************************
* DESCRIPTION:
* convert long seconds to Date and Time
*****************************************************************************/
void ExtractTime(u32_t j,Time_t *ttime)
{
u32_t date = j/86400l;

LongToTime(j - (date * 86400l),ttime);


};

void Printf_Time(u8_t *str,Time_t *ttime)
{

TrmPrintf(str,ttime->year,
ttime->month,
ttime->day,
ttime->hour,
ttime->minute,
ttime->sec);
}


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

Ответы



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

E-mail: info@telesys.ru