在嵌入式开发平台中,经常会用到Linux时间函数的一些操作,包括时间戳的读取、时间格式的转换等,以下是Linux时间操作中重要的函数及结构体的说明。
重要结构体:
struct tm
{
int tm_sec; /* seconds */
int tm_min; /* minutes */
int tm_hour; /* hours */
int tm_mday; /* day of the month */
int tm_mon; /* month */
int tm_year; /* year 从1900年算起至今的年数*/
int tm_wday; /* day of the week * 周一开始,0-6/
int tm_yday; /* day in the year */
int tm_isdst; /* daylight saving time */
};
相关函数:
time() 获取时间戳
函数原型: time_t time( time_t *t )
说明:返回从1970年1月1日0时0分0秒起到此时锁经过的秒数(若t非空,则同时也保存到t指向的内存)
例:
time_t timep; // 创建time_t 变量
time(&timep); // 获取时间戳
localtime() 时间戳 -> tm结构体
函数原型: struct tm *localtime(const time_t *timep);
说明:将由time函数获取到的时间戳的值转换为时间日期表示方法,以结构体tm返回。
例:
time_t current;
struct tm *timeinfo;
time(¤t);
timeinfo = localtime(¤t);
PS:localtime函数在多线程中是不安全的,或在同个流程中被重复调用时,之前调用的结果会被改写。因此在多线程编程中,可以使用localtime_r函数。
localtime_r() 时间戳 -> tm结构体
函数原型: struct tm *localtime_r(const time_t *timep,struct tm *result);
说明:功能与localtime相同,但在多线程中可以安全使用。
例:
time_t current;
struct tm result = {0};
time(¤t);
localtime_r(¤t,&result);
gmtime() 时间戳 -> tm结构体
函数原型: struct tm *gmtime(const time_t *timep);
说明:将由time函数获取到的时间戳的值转换为格林威治时间,以结构体tm返回。
例:
struct tm *p;
time_t timep;
time(&timep);
p = gmtime(&timep);
PS:与localtime()类似,在多线程编程中,使用gmtime_r()函数较安全。
asctime() tm结构体 -> 时间字符串
函数原型: char *asctime(const struct tm *tm);
说明:将tm结构体的时间转换为字符串返回
例:
struct tm *p;
time_t timep;
time(&timep);
p = gmtime(&timep);
printf(“The time is %s\n”,asctime(p));
ctime() 时间戳 -> 时间字符串
函数原型: char *ctime(const time_t *timep);
说明: 将time_t指向的数据转换为字符串返回
例:
time_t timep; // 创建time_t 变量
printf(“The time is %s\n”,ctime(timep));
PS:与localtime()类似,在多线程编程中,使用ctime_r()函数较安全。
mktime() tm结构体 -> 时间戳
函数原型: time_t mktime(struct tm *tm)
说明:将tm结构体转换为时间戳
#include<time.h>
//获取系统当前时间
time_t tim;
time(&tim);//得到的tim是一个long,需要转化为字符串
//把当前系统时间转化为字符串
char *p = ctime(&tim);
printf("%s\n", p);
//转换为具体时间
struct tm *alltime = gmtime(&tim);
printf("%d:%d:%d\n", alltime->tm_year+1900,
//得到的tm_year是比1900多的年份数目,因此要加1900alltime->tm_mon+1,//tm_mon : 0~11 所以要+1
alltime->tm_mday);
//时间打包
char buf[128];
sprintf(buf,"%d-%d-%d %d:%d:%d", alltime->tm_year+1900,
alltime->tm_mon+1,
alltime->tm_mday,
alltime->tm_hour+8,
alltime->tm_min,
alltime->tm_sec);