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;
    }
    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

 

 

你可能感兴趣的:(C语言,STM32F10X)