使用C语言编写程序需要获得当前精确时间(1970年1月1日到现在的时间),或者为执行计时,可以使用gettimeofday()函数。
#include <sys/time.h>
int gettimeofday(struct timeval*tv, struct timezone *tz);
其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果:
结构体timezone的定义为:
struct timezone{
int tz_minuteswest;/*格林威治时间往西方的时差*/
int tz_dsttime;/*DST 时间的修正方式*/
}
timezone 参数若不使用则传入NULL即可。
而结构体timeval的定义为:
struct timeval{
long int tv_sec; // 秒数
long int tv_usec; // 微秒数
}
它获得的时间精确到微秒(1e-6 s)量级。
在一段代码前后分别使用gettimeofday可以计算代码执行时间:
struct timeval tv_begin, tv_end;
gettimeofday(&tv_begin, NULL);
~~~
gettimeofday(&tv_end, NULL);
下面来看一个demo,怎样获取系统当前时间(用ms表示,并且获取程序段运行时间)
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
int
gettimeofday(
struct
timeval *tv,
struct
timezone *tz);
int
main(
int
argc,
char
* argv[])
{
struct
timeval t_start,t_end;
long
cost_time = 0;
//get start time
gettimeofday(&t_start, NULL);
long
start = ((
long
)t_start.tv_sec)*1000+(
long
)t_start.tv_usec/1000;
printf
(
"Start time: %ld ms\n"
, start);
sleep(2);
usleep(5000);
//5毫秒
//get end time
gettimeofday(&t_end, NULL);
long
end = ((
long
)t_end.tv_sec)*1000+(
long
)t_end.tv_usec/1000;
printf
(
"End time: %ld ms\n"
, end);
//calculate time slot
cost_time = end - start;
printf
(
"Cost time: %ld ms\n"
, cost_time);
return
0;
}
printf("second:%ld\n",tv.tv_sec); //秒
printf("millisecond:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000); //毫秒
printf("microsecond:%ld\n",tv.tv_sec*1000000 + tv.tv_usec); //微秒
其中,long
start = ((
long
)t_start.tv_sec)*1000+(
long
)t_start.tv_usec/1000;
用来表示,当前获取的系统时间,用毫秒来表示
C语言time(null)的用法
time_t time1 = time(NULL);//获取系统时间,单位为秒;
struct tm *ti = localtime(&time1);//转换成tm类型的结构体;
printf("get sys time = %s",asctime(ti));
printf("get sys time = %s",ctime(&time1));//两个打印结果一样
说明:此函数获得的tm结构体的时间是日历时间。
用 法: struct tm *localtime(const time_t *clock);返回值:返回指向tm 结构体的指针.
tm结构体是time.h中定义的用于分别存储时间的各个量(年月日等)的结构体.
struct tm {
int tm_sec; /* seconds after the minute - [0,59] */
int tm_min; /* minutes after the hour - [0,59] */
int tm_hour; /* hours since midnight - [0,23] */
int tm_mday; /* day of the month - [1,31] */
int tm_mon; /* months since January - [0,11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday - [0,6] */
int tm_yday; /* days since January 1 - [0,365] */
int tm_isdst; /* daylight savings time flag */
};
--另一种用法--------------------------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
int main(int argc,char * argv[])
{
struct timeval tv1,tv2;
struct tm *gmt, *area;
while(1)
{
gettimeofday(&tv1,0); //打印文件名和此段程序行数,并显示系统时间和微秒数;
printf("%s:%d linetime %ld:%ld\n",__FILE__,__LINE__,tv1.tv_sec,tv1.tv_usec);
area = localtime(&(tv1.tv_sec));//以本地时区显示时间
printf("Local time is: %s\n", asctime(area));
gmt = gmtime(&(tv1.tv_sec));//以GMT时区显示时间
printf("GMT is: %s\n", asctime(gmt));
sleep(2);
}
return 0;
}
运行结果:
===效果对比=====================================================================================
#include <stdio.h>
#include <time.h>
#include <sys/time.h> //gettimeofday
#include <unistd.h>
int main()
{
int gettimeofday (struct timeval *tv,struct timezone *tz);
time_t mytime;
//获取系统时间
time(&mytime);
struct tm *tm=localtime(&mytime);
printf("%d,%d,%d %d:%d:%d\n",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec);
printf("%s",ctime(&mytime));
printf("%ld\n",mytime);
struct timeval tv;
gettimeofday(&tv,NULL);
printf("%ld\n",tv.tv_sec);
}