RTC时钟换算函数

时间日期转换成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);




猜你喜欢

转载自blog.csdn.net/fuhanga123/article/details/78622472