C语⾔中关于获取时间的函数,包括如果获取微妙、毫秒级时间C语⾔获取时间的相关函数,包括如果获取微妙、毫秒级时间
在写程序的过程中,总是需要,或想去测试⼀段时间运⾏话费的时间,有需要测试秒级的,也许毫秒级的,但是有些更细微的程序我们需要测试其微秒级的时延。分别介绍如下:
1 微秒级的时延diff函数
1.1 timeval结构体
timeval结构体定义在time.h中:
struct timeval
{
__time_t tv_sec; /* Seconds. */
__suseconds_t tv_usec; /* Microseconds. */
};
其中,tv_sec为从1970-1-1零点零分到创建struct timeval时的秒数,tv_usec为微秒数。
注意:它是指从1970-1-1 0:0:0 零微秒⾄当前的时间差tv_sec秒后⾯的零头。所以,要想获取⼀个操作或⼦程序的运⾏毫秒或微秒级时长,不能简单实⽤前后两个时间采集点的tv_usec相减,否则会出现负值(如timeval_test_0.cpp),⽽应考虑到前后两个时间点的秒差(tv_sec)(见timeval_test.cpp及其运⾏结果)。
1.2 与timeval相关的gettimeofday()函数:
该函数的注解为:
/* Get the current time of day and timezone information,
putting it into *TV and *TZ. If TZ is NULL, *TZ is not filled.
Returns 0 on success, -1 on errors.
NOTE: This form of timezone information is obsolete.
Use the functions and variables declared in <time.h> instead. */
extern int gettimeofday (struct timeval *__restrict __tv,
__timezone_ptr_t __tz) __THROW __nonnull ((1));
gettimeofday()功能是得到当前时间和时区,分别写到tv和tz中,如果tz为NULL则不向tz写⼊。
1.3 源码与运⾏结果:
timeval_test_0.cpp:
int main()
{
timeval start,end;
double d=23.345;
double k=324.917;
double s;
long dif_sec, dif_usec;
for(int i=0; i<10; i++)
{
gettimeofday(&start, NULL);
for(int j=0; j<i*100000000; j++)
{
s += k*j - d*(j+3);
}
gettimeofday(&end, NULL);
dif_sec = end.tv_sec - start.tv_sec;
dif_usec = end.tv_usec - start.tv_usec;
printf("running time for %d loop is %ldsec (%ld us)\n", i, dif_sec, dif_usec); }
return 0;
}
运⾏结果为:
timeval_test.cpp:
int main()
{
timeval start,end;
double d=23.345;
double k=324.917;
double s;
long dif_sec, dif_usec;
for(int i=0; i<10; i++)
{
gettimeofday(&start, NULL);
for(int j=0; j<i*100000000; j++)
{
s += k*j - d*(j+3);
}
gettimeofday(&end, NULL);
dif_sec = end.tv_sec - start.tv_sec;
dif_usec = end.tv_usec - start.tv_usec;
printf("start.tv_sec=%ld, start.tv_usec=%ld\n", start.tv_sec, start.tv_usec);
printf("end.tv_sec=%ld, end.tv_usec=%ld\n", end.tv_sec, end.tv_usec);
printf("running time for %d loop is %ldsec (%ld us)\n\n", i, dif_sec, dif_sec*1000000+dif_usec); }
return 0;
}
运⾏结果:
2 毫秒级时延
2.1 time_t结构体
time_t实际上是长整数类型,定义为:typedef long time_t; /* time value */
2.2 tm结构体
struct tm
{
int tm_sec; /*代表⽬前秒数,正常范围为0-59,但允许⾄61秒 */
int tm_min; /*代表⽬前分数,范围0-59*/
int tm_hour; /* 从午夜算起的时数,范围为0-23 */
int tm_mday; /* ⽬前⽉份的⽇数,范围01-31 */
int tm_mon; /*代表⽬前⽉份,从⼀⽉算起,范围从0-11 */
int tm_year; /*从1900 年算起⾄今的年数*/
int tm_wday; /* ⼀星期的⽇数,从星期⼀算起,范围为0-6。*/
int tm_yday; /* Days in year.[0-365] */
int tm_isdst; /*⽇光节约时间的旗标DST. [-1/0/1]*/
};
3.3 获取具体时间
没时间写了,具体的以下内容全copy之 wwwblogs/wainiwann/archive/2012/11/28/2792133.html 。
原型:time_t time(time_t * timer)
功能: 获取当前的系统时间,返回的结果是⼀个time_t类型,其实就是⼀个⼤整数,其值表⽰从CUT(Coordinated Universal Time)时间1970年1⽉1⽇00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。然后调⽤localtime将time_t所表⽰的CUT时间转换为本地时间(我们是+8区,⽐CUT多8个⼩时)并转成struct tm类型,该类型的各数据成员分别表⽰年⽉⽇时分秒。
程序例1:
time函数获得⽇历时间。⽇历时间,是⽤“从⼀个标准时间点到此时的时间经过的秒数”来表⽰的时间。这个标准时间点对不同的编译器来说会有所不同,但对⼀个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的⽇历时间都通过该标准时间点来衡量,所以可以说⽇历时间是“相对时间”,但是⽆论你在哪⼀个时区,在同⼀时刻对同⼀个标准时间点来说,⽇历时间都是⼀样的。
#include <time.h>
#include <stdio.h>
#include <dos.h>
int main(void)
{
time_t t; t = time(NULL);
printf("The number of seconds since January 1, 1970 is %ld",t);
return 0;
}
⽤time()函数结合其他函数(如:localtime、、、)可以获得当前系统时间或是标准时间。
#include <stdio.h>
#include <stddef.h>
#include <time.h>
int main(void)
{
time_t timer;//time_t就是long int 类型
struct tm *tblock;
timer = time(NULL);//这⼀句也可以改成time(&timer);
tblock = localtime(&timer);
printf("Local time is: %s\n",asctime(tblock));
return 0;
}
gmtime()函数
原型:struct tm *gmtime(long *clock);
功能:把⽇期和时间转换为格林威治(GMT)时间的函数。将参数timep 所指的time_t 结构中的信息转换成真实世界所使⽤的时间⽇期表⽰⽅法,然后将结果由结构tm返回。
说明:此函数返回的时间⽇期未经时区转换,⽽是UTC时间。
返回值:返回结构tm代表⽬前UTC 时间
localtime()函数
功能: 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为⽇历时间。
说明:此函数获得的tm结构体的时间,是已经进⾏过时区转化为本地时间。
⽤法: struct tm *localtime(const time_t *clock);
返回值:返回指向tm 结构体的指针.tm结构体是time.h中定义的⽤于分别存储时间的各个量(年⽉⽇等)
的结构体.
程序例1:
#include <stdio.h>
#include <stddef.h>
#include <time.h>
int main(void)
{
time_t timer;//time_t就是long int 类型
struct tm *tblock;
timer = time(NULL);
tblock = localtime(&timer);
printf("Local time is: %s\n",(tblock));
return 0;
}
执⾏结果:
Local time is: Mon Feb 16 11:29:26 2009
程序例2:
上⾯的例⼦⽤了asctime函数,下⾯这个例⼦不使⽤这个函数⼀样能获取系统当前时间。
需要注意的是年份加上1900,⽉份加上1。
#include<time.h>
#include<stdio.h>
int main()
{
struct tm *t;
time_t tt;
time(&tt);
t=localtime(&tt);
printf("%4d年%02d⽉%02d⽇ %02d:%02d:%02d\n",
t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
return 0;
}
localtime()和gmtime()的区别:
gmtime()函数功能类似获取当前系统时间,只是获取的时间未经过时区转换。
localtime函数获得的tm结构体的时间,是已经进⾏过时区转化为本地时间。
localtime_r()和 gmtime_r()函数
struct tm * gmtime_r (const time_t *timep, struct tm *result);
struct tm *localtime_r(const time_t *timep, struct tm *result);
gmtime_r()函数功能与此相同,但是它可以将数据存储到⽤户提供的结构体中。
localtime_r()函数功能与此相同,但是它可以将数据存储到⽤户提供的结构体中。它不需要设置tzname。 使⽤gmtime和localtime后要⽴即处理结果,否则返回的指针指向的内容可能会被覆盖。
⼀个好的⽅法是使⽤gmtime_r和localtime_r,由于使⽤了⽤户分配的内存,这两个函数是不会出错的。asctime()函数
功能: 转换⽇期和时间为相应的字符串(英⽂简写形式,形如: Mon Feb 16 11:29:26 2009)
⽤法: char *asctime(const struct tm *tblock);
ctime()函数
功能: 把⽇期和时间转换为字符串。
(英⽂简写形式,形如:
Mon Feb 16 11:29:26 2009)
⽤法: char *ctime(const time_t *time);
说明:ctime同asctime的区别在于,ctime是通过⽇历时间来⽣成时间字符串,
⽽asctime是通过tm结构来⽣成时间字符串。
mktime()函数
功能:将tm时间结构数据转换成经过的秒数(⽇历时间)。
原型:
time_t mktime(strcut tm * timeptr);。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论