Unix时间戳与标准时间格式互换
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;
{
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;
while (i<month)
{
days += EndOfMonth[i - 1];
unix时间戳转换日期格式i += 1;
}
days += day-1;
sec = (days * 24 + hour) * 3600 + minute * 60 + second; return (sec);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论