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小时内删除。