一、介绍
#include<sys/time.h> /* 需要的头文件 */
/将得到从linux epoch(1970年1月1日0点0分0秒,UTC格林威治时间)算起的总秒和微秒数。结构体struct timeval中tv_sec存储秒数,tv_usec存储微秒数。/
int gettimeofday(struct timeval * tv,struct timezone * tz);/* 函数声明 */
结构体timeval的定义为:
struct timeval{
long int tv_sec; // 秒数
long int tv_usec; // 微秒数
}
其实gettimeofday()函数是用来获取时间的,而上面的两个结构体是通过gettimeofday函数获取秒和微秒的
例如1:不需要时区的
#include <stdio.h>
#include <sys/time.h>
int main(void)
{
struct timeval tx;
gettimeofday(&tx,NULL);
printf(“获取的秒时间 = %ld 获取的微秒时间 =%ld\n”,tx.tv_sec,tx.tv_usec);
return 0;
}
运行的结果是:获取的秒时间 = 1514205194 获取的微秒时间 =756161
在了解第二个参数时首先要知道时区的意思。
int tz_minuteswest;//与格林尼治时间差,我们为东八区,即北京时间比该时间早八个小时,即当我们的时间是早上八点的时候,格林尼治时间(即世界时)为0点。与格林时间的差为-8小时(个人认为是因为选择编译器或者操作操作系统时选择的是北京时间,所以格林尼治时间相对于北京时间为-8小时,个人猜测,有待考证)。
int tz_dsttime;//DST 时间的修正方式
tz_dsttime 所代表的状态如下
DST_NONE /不使用/
DST_USA /美国/
DST_AUST /澳洲/
DST_WET /西欧/
DST_MET /中欧/
DST_EET /东欧/
DST_CAN /加拿大/
DST_GB /大不列颠/
DST_RUM /罗马尼亚/
DST_TUR /土耳其/
DST_AUSTALT /澳洲(1986年以后)/
返回值 成功则返回0,失败返回-1,错误代码存于errno。附加说明EFAULT指针tv和tz所指的内存空间超出存取权限。
举例2:有时区的
#include <stdio.h>
#include <sys/time.h>
int main(void)
{
struct timeval tx;
struct timezone tz;
gettimeofday(&tx,&tz);
printf("获取的秒时间 = %ld 获取的微秒时间 =%ld\n",tx.tv_sec,tx.tv_usec);
printf("与格林尼治的时差 = %ld DST矫正时差 =%ld\n",tz.tz_minuteswest,tz.tz_dsttime);
//tz.tz_minuteswest根据参数名称知道单位是分钟,我们可以转换成转换一下小时
printf("格林尼治相对于北京时间 time =%d\n",tz.tz_minuteswest/60);
return 0;
}
结果:
获取的秒时间 = 1514207086 获取的微秒时间 =416064
与格林尼治的时差 = -480 DST矫正时差 =0
格林尼治相对于北京时间 time =-8
个人使用的求时间差的函数:
unsigned int UpTime( void )
{
unsigned int nTime = 0;
static bool bIsFirst = true;
static struct timeval FirstTime;
struct timeval TimeValue;
struct timezone TimeZone;
if( bIsFirst ) {
gettimeofday( &FirstTime, &TimeZone );
bIsFirst = false;
return nTime;
}
if( 0 == gettimeofday( &TimeValue, &TimeZone ) ) {
nTime = ( TimeValue.tv_sec - FirstTime.tv_sec ) * 1000;
nTime += ( TimeValue.tv_usec - FirstTime.tv_usec ) / 1000;
}
return nTime;
}
参考:https://blog.csdn.net/qq_33706673/article/details/78896420