现在的位置: 首页 > 综合 > 正文

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

2013年08月15日 ⁄ 综合 ⁄ 共 2476字 ⁄ 字号 评论关闭

参照: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中

示例:

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

说明:

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所指的结构中。

示例:

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

附加:

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表示从凌晨算起的毫秒数;



 

抱歉!评论已关闭.