Unix时间戳格式便于信息存储和传播,而标准时间格式可读性强。这二者在嵌入式程序中往往需要转换格式。UNIX时间戳的起点是1970年1月1日0时0分0秒,而从1970年到2100年之间每4年中间是一个闰年,即4年1个周期,共1461天。
Unix时间戳
Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
标准时间格式
中华人民共和国国家标准GB/T 7408-2005《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:2000等效采用。
日的时间表示法
合并表示时,要在时间前面加一大写字母T,如要表示北京时间2004年5月3日下午5点30分8秒,可以写成2004-05-03T17:30:08+08:00或20040503T173008+08。
转换代码
只适用于1970年至2100年之间的时间,如果跨2100年需要加以修改。代码中的年份从1970年算起。
typedef struct
{
uint8_t sec;
uint8_t minute;
uint8_t hour;
uint8_t month;
uint8_t day;
uint8_t year;//减去1970
}LOCAL_TIME_T;
LOCAL_TIME_T local_time_t;
uint8_t EndOfMonth[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
uint16_t DaysOfYear[4] = { 365, 365, 366, 365};
/**
* @brief This function translate timestampe to localtime.
* @param None
* @retval None
*/
void localtime(uint32_t sec,LOCAL_TIME_T *pLocal_time)
{
uint32_t sec;
uint32_t days; //天数
uint8_t second; //秒
uint8_t minute; //分
uint8_t hour; //时
uint8_t day; //日
uint8_t month; //月
uint8_t year; //年
uint8_t i = 0;
days = sec / 3600 / 24; //天数
year = (days / 1461) * 4;//4年一个周期:1461天
days %= 1461;
i = 0;
while (days >= DaysOfYear[i])
{
days -= DaysOfYear[i++];
year += 1;
}
if (2 == i)
{
EndOfMonth[1] = 29;
}
else
{
EndOfMonth[1] = 28;
}
i = 0;
while (days >= EndOfMonth[i])
{
days -= EndOfMonth[i++];
}
month = i + 1;
day = days + 1;
hour = sec /3600 % 24;
minute = sec % 3600 / 60;
second = sec % 60;
pLocal_time->year = year;
pLocal_time->month = month;
pLocal_time->day = day;
pLocal_time->hour = hour;
pLocal_time->minute = minute;
pLocal_time->sec = second;
}
/**
* @brief This function translate localtime to timestampe.
* @param None
* @retval None
*/
uint32_t time(LOCAL_TIME_T *pLocal_time)
{
uint32_t sec;
uint32_t days; //天数
uint8_t second; //秒
uint8_t minute; //分
uint8_t hour; //时
uint8_t day; //日
uint8_t month; //月
uint8_t year; //年
uint8_t i = 0;
year = pLocal_time->year;
month = pLocal_time->month;
day = pLocal_time->day;
hour = pLocal_time->hour;
minute = pLocal_time->minute;
second = pLocal_time->sec;
days = (year / 4) * 1461;
year = year % 4;
i = 0;
while (i<year)
{
days += DaysOfYear[i++];
}
if (2==year)
{
EndOfMonth[1] = 29;
}
else
{
EndOfMonth[1] = 28;
}
i = 1;
while (i<month)
{
days += EndOfMonth[i - 1];
i += 1;
}
days += day-1;
sec = (days * 24 + hour) * 3600 + minute * 60 + second;
return (sec);
}