您的位置:首页 > 运维架构 > Linux

linux 常用时间函数及时间类型

2012-12-12 14:22 435 查看
参照:http://www.linuxdiyf.com/viewarticle.php?id=81130


常用的数据类型

time_t                          一般用来存储国际化时间,用time()函数可直接获取到;

结构体:tm                 一般用来存储本地时间,可通过将time_t格式转化而来;

结构体:time_val        一般用来存储计数型的时间(秒/毫秒);

有些也用struct tim,但好像不如time_val好用。

常用的时间函数及头文件

包含头文件:#include <time.h>

1. 功能:将时间转化为字符

char *asctime(const struct tm *tm);

char *asctime_r(const struct tm *tm, char *buf);

char *ctime(const time_t *timep);

char *ctime_r(const time_t *timep, char *buf);

2. 功能:将time_t类型转为tm结构体,即转化为格林尼治时间

struct tm *gmtime(const time_t *timep);

struct tm *gmtime_r(const time_t *timep, struct tm *result);

3. 功能:将国际时间转为本地时间

struct tm *localtime(const time_t *timep);

struct tm *localtime_r(const time_t *timep, struct tm *result);

time_t mktime(struct tm *tm);

4. 功能:计算时间差

double difftime(time_t time1, time_t time0);

包含头文件:#include <sys/time.h>

5. 功能:获取时间

int gettimeofday(struct timeval *tv, struct timezone *tz);

6. 功能:设置时间

int settimeofday(const struct timeval *tv, const struct timezone *tz);

获取系统时间

1.可以用localtime()函数分别获取年月日时分秒的数值。

在所有的UNIX下,都有个time()的函数;

格式:time_t time(time_t *t);

这个函数会传回格林尼治时间,如果t是non-null,它将会把时间值填入t中

示例:

[cpp] view
plaincopy

<span style="font-size:10px;">#include <time.h>  

#include <stdio.h>  

  

int main()  

{  

    time_t now;  

    struct tm * timenow;  

  

    time(&now);  

    //printf("International time is %s\n", ctime(&now));  

    printf("International time is %s\n", asctime(gmtime(&now)));  

    timenow=localtime(&now);  

    printf("Local time is %s\n", asctime(timenow));  

}</span>  

说明:

time()函数读取现在的时间(国际标准时间,而非北京时间),然后传值给now;

localtime()函数将国际标准时间转化为本地时间(本地所设地区),返回结果给timenow;

asctime()函数将tm结构体类型的转化为字符;

2. 可以用gettimeofday()函数获取精确时间(精确到毫秒)

对某些需要较高精准度的需求,Linux提供了gettimeofday()。

格式:int gettimeofday(struct timeval * tv,struct timezone *tz);

其中,第一个参数用来返回信息,第二个参数一般设为0(指针可直接赋0,linux下的特色);

gettimeofday()会把目前的时间有tv所指的结构返回,本地时区信息(一般没什么用,设为0)则放到tz所指的结构中。

示例:

[cpp] view
plaincopy

<span style="font-size:10px;">#include <stdlib.h>  

#include <sys/time.h>  

#include <stdio.h>  

  

bool time_subtract(struct timeval * result, struct timeval * x, struct timeval * y)  

{  

    if(x->tv_sec<y->tv_sec)  

        return false;  

    result->tv_sec=x->tv_sec-y->tv_sec;  

    result->tv_usec=x->tv_usec-y->tv_usec;  

}  

  

int main()  

{  

    struct timeval start, stop, diff;  

    gettimeofday(&start, 0);  

  

    for(int i=0; i<10000000; i++)  

    {}  

    gettimeofday(&stop, 0);  

  

    time_subtract(&diff, &start, &stop);  

  

    printf("共用时%d ms\n",diff.tv_usec);  

}</span>  

附加:

1. 结构体:tm

struct tm 



int tm_sec; 

int tm_min; 

int tm_hour; 

int tm_mday; 

int tm_mon; 

int tm_year; 

int tm_wday; 

int tm_yday; 

int tm_isdst; 

}; 

tm_sec表「秒」数,在[0,61]之间,多出来的两秒是用来处理跳秒问题用的。 

tm_min表「分」数,在[0,59]之间。 

tm_hour表「时」数,在[0,23]之间。 

tm_mday表「本月第几日」,在[1,31]之间。 

tm_mon表「本年第几月」,在[0,11]之间。 

tm_year要加1900表示那一年。 

tm_wday表「本第几日」,在[0,6]之间。 

tm_yday表「本年第几日」,在[0,365]之间,闰年有366日。 

tm_isdst表是否为「日光节约时间」。

2. 结构体:timeval

struct timeval



int tv_sec; 

int tv_usec; 

}; 

tv_sec表示从凌晨开始算起的秒数;

tv_usec表示从凌晨算起的微秒数(microsecond);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: