time()等时间函数的使用

一、time函数

函数名:time()

功能:获取当前的系统时间

用法:time_ttime(time_t * time)

对应的头文件:time.h

说明:

time函数的返回值是long的类型,

其精度为秒,

其形参一般选为NULL(即time(NULL)).

其值为从CUT(CoordinatedUniversal Time)时间(即1970年1月1日00:00:00,也就是UNIX系统的Epoch时间)到当前时刻的秒数,但因为“time_t“使用一个有符号的32位整数(signed int32)来存储计算的秒数,所以其最后时间是2147483647秒(也就是格林乔治时间2038年1月19日凌晨03:14:07),但就是个小知识点,不用太关心。

因为time的精度为秒,所以如果对一些时间要求更精确点,便得使用精度更高的时间函数,不然其结果就会如下面的程序一样,结果一直一样,这是因为短期的循环计算机不会花费太多的时间。

# include 

二、更高精度的时间函数

1、gettimeofday

函数名:gettimeofday

功能:获取当前的精确系统时间

用法:int gettimeofday(structtimeval * tv,struct timezone *tz);

对应的头文件:sys/time.h

说明:

其参数tv是保存获取时间结果的结果体,参数tz用于保存时区结果:

struct timezone{

inttz_minuteswest;  //格林威治时间往西方的时差

inttz_dsttime;      //DST时间的修正方式

}

timezone参数若不使用则可设为NULL(如:gettimeofday(tv,NULL)),

struct timeval{

long int tv_sec;   //秒数

long int tv_usec;  //微妙数

}

使用gettimeofday()函数还需要先定义一下struct timeval的变量,

而使用gettimeofday()获得的时间的精度会精确到微妙(1e-6s)量级。

其值为从CUT(CoordinatedUniversal Time)时间(即1970年1月1日00:00:00,也就是UNIX系统的Epoch时间)到当前时刻的秒数,其也与time一样存在着2038年的问题。

但它是适用于Linux系统的,在windows下面使用比较麻烦,而windows也存在这类似功能的函数。

2、GetLocalTime

函数名:GetLocalTime

功能:获取当前的精确系统时间

用法:voidGetLocalTime(LPSYSTEMTIME lpSystemtime)

对应的头文件:windows.h

说明:

其参数lpSystemtime是指向一个用户自定义包含日期和时间信息的SYSTEMTIME类型的变量,该变量可用于保存函数获取的时间。

typedef struct SYSTEMTIME{

WORD wYear;       //年

WORD wMonth;      //月

WORD wDayOfWeek;  //星期,0为星期日,1为星期一,2为星期二……

WORD wDay;        //

WORD wHour;       //时

WORD wMinute;     //分

WORD wSecond;      //秒

WORD wMilliseconds;  //毫秒

}SYSTEMTIME,*PSYSTEMTIME;

一般将GetLocalTime转化为gettimeofday来提高程序在windows和Linux的通用性。

#include 


3、GetTickCount函数

函数名:GetTickCount

功能:获取当前的精确系统时间

用法:DWROD GetTickCount(void)

对应的头文件:windows.h

说明:

其返回了从操作系统启动所经过的毫秒数,其返回值为32位的双字类型DWROD。

# include 


可以发现GetTickCount()虽说是能返回毫秒级的精度,但因为计算机的一些原因,其精度一般保存在18ms左右。


所以在srand()初始化rand()的初始种子时,尽量在循环外面,而不是里面。


此外,时间函数可以用来指定延迟时间的长短,


void delay(int n)
{
int time_first = 0;
int time_end = 0;


time_first = (int)(GetTickCount());


while (1){
for (int i = 0; i < 1000; i++)
for (int j = 0; j < 10000; j++);
time_end = (int)(GetTickCount());
if (time_end >(time_first + n))
break;
}
}




本文链接:https://my.lmcjl.com/post/10929.html

展开阅读全文

4 评论

留下您的评论.