|
发表于 2019-3-12 16:35:39
|
显示全部楼层
请搜时间戳的函数,然后计算。 我刚用了,贴一下:
#define SECOND_OF_DAY 3600*24
extern const uint8_t Cnst_Month_Tbl[12];
const uint8_t Cnst_Month_Tbl0[12]={31,28,31,30,31,30,31,31,30,31,30,31};
void GetDateTimeFromSecond(u32 lSec, _real_time *tTime)
{
u16 i,j,iDay;
u32 lDay=0,temp;
lSec = lSec + 8*3600;//转换为北京时间
temp=lSec;
while(temp>SECOND_OF_DAY)
{
temp-=SECOND_OF_DAY;
lDay++;
}
////lDay = lSec/SECOND_OF_DAY; 不支持除法 32位 ?? 20190227
////lSec = lSec%SECOND_OF_DAY;
lSec=temp;
i = 1970;
while(lDay > 365)
{
if(((i%4==0)&&(i%100!=0)) || (i%400==0))//闰年
lDay -= 366;
else
lDay -= 365;
i++;
}
if((lDay == 365) && !(((i%4==0)&&(i%100!=0)) || (i%400==0)))
{
lDay -= 365;
i++;
}
tTime->year = i;//年份
for(j=0;j<12;j++)
{
if((j==1) && (((i%4==0)&&(i%100!=0)) || (i%400==0)))
iDay = 29;
else
iDay = Cnst_Month_Tbl0[j];
if(lDay >= iDay) lDay -= iDay;
else
break;
}
tTime->month = j+1;
tTime->day = lDay+1;
tTime->hour = ((lSec / 3600))%24;
tTime->min = (lSec % 3600) / 60;
tTime->sec = (lSec % 3600) % 60;
} |
|