全部博文(2005)
分类:
2007-05-17 14:47:06
秒数转换成日期和日期转换成秒数ARM源程序(ARM含详细注解gliethttp) 通常情况下PC上用time可以获得开机秒数,用localtime可以将秒数转换成年、月、日、时、分、秒但因为没有源代码,只是以库文件的形式提供,带来许多不便,所以在ARM上使用只能自己完成相应功能的时间互换,以下是作者完成的转换函数封装(这两个函数已经经过严格测试,没有发现问题,如发现问题,请与作者联系)代码如下:
版 本 】v1.0
函 数 名 称 】uint32 xDate2Seconds(_xtime *time)
创建人及创建时间 】gliethttp 2006-06-08 10:19
修改人及修改时间 】
修 改 原 因 】
功 能 描 述 】该函数计算从2006年1月1日0时0分0秒起到当前时间所经过的秒数
#define xMINUTE (60 )//1分的秒数
#define xHOUR (60*xMINUTE )//1小时的秒数
#define xDAY (24*xHOUR )//1天的秒数
#define xYEAR (365*xDAY )//1年的秒数
uint32 xDate2Seconds(_xtime *time)
{static uint32 month[12]={
/*01月*/xDAY*(0),
/*02月*/xDAY*(31),
/*03月*/xDAY*(31+28),
/*04月*/xDAY*(31+28+31),
/*05月*/xDAY*(31+28+31+30),
/*06月*/xDAY*(31+28+31+30+31),
/*07月*/xDAY*(31+28+31+30+31+30),
/*08月*/xDAY*(31+28+31+30+31+30+31),
/*09月*/xDAY*(31+28+31+30+31+30+31+31),
/*10月*/xDAY*(31+28+31+30+31+30+31+31+30),
/*11月*/xDAY*(31+28+31+30+31+30+31+31+30+31),
/*12月*/xDAY*(31+28+31+30+31+30+31+31+30+31+30)
};
uint32 seconds;
uint8 year;
year = time->year-06; 考虑2100年千年虫问题
seconds = xYEAR*year + xDAY*((year+1)/4);几年过去的秒数
seconds += month[time->month-1]; 上今年本月过去的秒数
if( (time->month > 2) && (((year+2)%4)==0) )//2008年为闰年
seconds += xDAY; 年加1天秒数
seconds += xDAY*(time->day-1); 上本天过去的秒数
seconds += xHOUR*time->hour; 上本小时过去的秒数
seconds += xMINUTE*time->minute; 上本分钟过去的秒数
seconds += time->second; 上当前秒数
return seconds;
}
版 本 】v1.0
函 数 名 称 】void xSeconds2Date(uint32 seconds,_xtime *time)
创建人及创建时间 】gliethttp 2006-06-08 10:20
修改人及修改时间 】
修 改 原 因 】
功 能 描 述 】秒数转换为年、月、日、时、分、秒
void xSeconds2Date(uint32 seconds,_xtime *time)
{static uint8 month[12]={
/*01月*/31,
/*02月*/28,
/*03月*/31,
/*04月*/30,
/*05月*/31,
/*06月*/30,
/*07月*/31,
/*08月*/31,
/*09月*/30,
/*10月*/31,
/*11月*/30,
/*12月*/31
};
uint32 days;
uint16 leap_y_count;
time->second = seconds % 60;//获得秒
seconds /= 60;
time->minute = seconds % 60;//获得分
seconds /= 60;
time->hour = seconds % 24;//获得时
days = seconds / 24;//获得总天数
leap_y_count = (days + 365) / 1461;//过去了多少个闰年(4年一闰)
if( ((days + 366) % 1461) == 0)
{//闰年的最后1天
time->year = 06 + (days / 366);//获得年
time->month = 12; 整月
time->day = 31;
return;
}
days -= leap_y_count;
time->year = 06 + (days / 365); //获得年
days %= 365; 年的第几天
days = 01 + days; 日开始
if( (time->year % 4) == 0 )
{
if(days > 60)--days; 年调整
else
{
if(days == 60)
{
time->month = 2;
time->day = 29;
return;
}
}
}
for(time->month = 0;month[time->month] < days;time->month++)
{
days -= month[time->month];
}
++time->month; 整月
time->day = days; 得日
}