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