欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言的时间函数(1)gettimeofday,timeval,timezone

程序员文章站 2024-01-27 18:17:04
...

gettimeofday是函数,其头文件和声明如下

#include <sys/time.h>

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

其参数tv是保存获取时间结果的结构体,参数tz用于保存时区结果timezone 参数若不使用则传入NULL即可。

 

下面是timeval和timezone的结构体说明:

struct timezone{

int tz_minuteswest;/*格林威治时间往西方的时差*/

int tz_dsttime;/*DST 时间的修正方式*/

}

而结构体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