时间日期转换成32位数
typedef struct CTime_tagtm
{ // 日期时间
u8 tm_sec; // seconds after the minute - [0,59]
u8 tm_min; // minutes after the hour - [0,59]
u8 tm_hour; // hours since midnight - [0,23]
u8 tm_wday; // days since Sunday - [0,6]
u8 tm_mday; // day of the month - [1,31]
u8 tm_mon; // months since January - [0,11]
u16 tm_year; // Year (2000, 2068)
} CTime_tm;
typedef u32 CTime_time_t; // date/time in unix secs past 1-Jan-2000.
#define CTime_time_t_MAX _UI32_MAX // maximum CTime_time_t value
// 获得秒单位,同时获取星期几。
CTime_time_t CTime_mktime(CTime_tm * ptm)
{
u32 days;
if ((ptm->tm_year < 2000) || (ptm->tm_year >= 2068) || (ptm->tm_mon > 11) || (ptm->tm_mday > 31) || (ptm->tm_mday == 0)
|| (ptm->tm_hour > 23) || (ptm->tm_min > 59) || (ptm->tm_sec > 59))
return 0;
days = (ptm->tm_year-2000)*365L + (ptm->tm_year-1997)/4; // 获得到前一年末的总天数。
days += CTime_DaysofMonths[ptm->tm_mon]; // 加上当年之前月的总天数
if ((ptm->tm_year-2000) % 4 == 0) // 当年为闰年
{
if (ptm->tm_mon >= 2)
days++;
}
days += ptm->tm_mday - 1; // 加上当月之前的天数
// 2000年1月1日星期六,为6
ptm->tm_wday = (u8) ((days+6) % 7); // 获得星期几
return days*(3600L*24L) + (ptm->tm_hour)*3600L + (ptm->tm_min)*60 + ptm->tm_sec;
}
eg:
CTime_tm tmNow;
SStmRtc_GetCurrentTimeAndDate(&tmNow);
TRACE6('K', 'K', "time=%d:%d:%d--%d:%d:%d", tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec, tmNow.tm_mday, tmNow.tm_mon, tmNow.tm_year);
u32 time;
time = CTime_mktime(&tmNow);
32位数转换成时间日期
// 获得标准时间
void CTime_gmtime(CTime_tm * ptm, CTime_time_t tt)
{
u32 days,days2;
u32 year,i;
days = tt / (3600L*24L); //一天,单位:秒
tt %= (3600L*24L);
ptm->tm_hour = (u8) (tt / 3600L); //小时
tt %= 3600L;
ptm->tm_min = (u8) (tt / 60L); //分钟
ptm->tm_sec = (u8) (tt % 60L); //秒
// 2000年1月1日星期六,为6
ptm->tm_wday = (u8) ((days+6) % 7); // 获得星期几
days2 = days;
year = days / 365;
days %= 365;
if (year)
{
i = (year+3) / 4;
/*if (days >= i)
days -= i;
else{
year -= 1;
days = days + 366 - i;
}*/
if (days >= i) {}
else year -= 1;
}
days = days2 - ((year)*365L + (year+3)/4);
ptm->tm_year = (u16)(2000 + year);
if (((year % 4) == 0) && (days >= 59)) // 当年为闰年
{
if (days == 59)
{
ptm->tm_mon = 1;
ptm->tm_mday = 29;
return;
}else
days--;
}
for (i = 11; ; --i)
{
if (days >= CTime_DaysofMonths[i])
break;
if (i == 0) break;
}
ptm->tm_mon = (u8)i;
ptm->tm_mday = (u8) (days-CTime_DaysofMonths[i] + 1);
}
// 获得当天已经过去的秒数
u32 CTime_GetDaySeconds(CTime_time_t tt)
{
return (tt % (3600L*24L));
}
// 获得标准时间
void CTime_gmtime(CTime_tm * ptm, CTime_time_t tt)
{
u32 days,days2;
u32 year,i;
days = tt / (3600L*24L); //一天,单位:秒
tt %= (3600L*24L);
ptm->tm_hour = (u8) (tt / 3600L); //小时
tt %= 3600L;
ptm->tm_min = (u8) (tt / 60L); //分钟
ptm->tm_sec = (u8) (tt % 60L); //秒
// 2000年1月1日星期六,为6
ptm->tm_wday = (u8) ((days+6) % 7); // 获得星期几
days2 = days;
year = days / 365;
days %= 365;
if (year)
{
i = (year+3) / 4;
/*if (days >= i)
days -= i;
else{
year -= 1;
days = days + 366 - i;
}*/
if (days >= i) {}
else year -= 1;
}
days = days2 - ((year)*365L + (year+3)/4);
ptm->tm_year = (u16)(2000 + year);
if (((year % 4) == 0) && (days >= 59)) // 当年为闰年
{
if (days == 59)
{
ptm->tm_mon = 1;
ptm->tm_mday = 29;
return;
}else
days--;
}
for (i = 11; ; --i)
{
if (days >= CTime_DaysofMonths[i])
break;
if (i == 0) break;
}
ptm->tm_mon = (u8)i;
ptm->tm_mday = (u8) (days-CTime_DaysofMonths[i] + 1);
}
// 获得星期几 days since Sunday - [0,6]
u32 CTime_GetWeekDay(CTime_time_t tt)
{
u32 days;
days = tt / (3600L*24L);
// 2000年1月1日星期六,为6
return ((days+6) % 7); // 获得星期几
}
eg:
CTime_tm tm;
u32 tt = GetDwordFromPtr(param->timedata);
CTime_gmtime(&tm, tt);