C\C++ 时间函数gettimeofday,timeval,timezone小结

一、介绍

#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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值