C中时间精确到毫秒

前言:

之前一篇博文对 time.h 进行了解读,但是如果需要时间精确到毫秒,time_t、tm还是无法满足的,需要另外一种方式。

 

方法1:timespec和timeval

#include <time.h>


struct timespec
{
    __time_t tv_sec;        /* Seconds.  */
    __syscall_slong_t tv_nsec;  /* Nanoseconds.  */
}

time.h 中有结构体timespec,这里精确到ns

 

#include <sys/time.h>


struct timeval
{
    __time_t tv_sec;        /* Seconds.  */
    __suseconds_t tv_usec;  /* Microseconds.  */
}

sys/time.h 中结构体timeval 精确到us

比较下来,timespec 和timeval 只是在第二个成员存在一个1000的数量级只差。即 tv_nsec = tv_usec *1000;

 

我们这里采用sys/time.h 中现成的接口:

void sysUsecTime(void)
{
    struct timeval tv;
    struct timezone tz;   
    struct tm *t;
     
    gettimeofday(&tv, &tz);
    printf("tv_sec:%ld\n",tv.tv_sec);
    printf("tv_usec:%ld\n",tv.tv_usec);
    printf("tz_minuteswest:%d\n",tz.tz_minuteswest);
    printf("tz_dsttime:%d\n",tz.tz_dsttime);
     
    t = localtime(&tv.tv_sec);
    printf("time_now:%d-%d-%d %d:%d:%d.%ld\n", 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec);
}

使用gettimeofday接口,获取精确的秒时间和毫秒时间。

可以通过tv_sec,获取精确的tm 数据;通过tv_usec 获取精确的ms 数据。

如果不需要获取时区相关信息,第二个参数可以设为NULL。

 

时区结构:

#include <sys/time.h>

struct timezone
{
    int tz_minuteswest; /* Minutes west of GMT.  */
    int tz_dsttime;     /* Nonzero if DST is ever in effect.  */
};

 

方法2:timeb

#include <sys/timeb.h>

struct timeb
{
    time_t time;
    unsigned short int millitm;
    short int timezone;
    short int dstflag;
};

extern int ftime (struct timeb *__timebuf);

没有看到源码中对于timeb 的其他解释,应该是time.h的补充?

通过ftime 函数可以直接获取到timeb 信息,其中millitm 为毫秒。

 

实例:

void sysUsecTime4(void)
{
    printf("====sysUsecTime4\n");
    struct timeb tv;
    struct tm *t;
     
    ftime(&tv);
     
    t = localtime(&tv.time);
    printf("time_now:%d-%d-%d %d:%d:%d.%ld\n", 1900+t->tm_year, 1+t->tm_mon, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, tv.millitm);
}

 

遗留问题:

这里写下个人项目中碰到的疑点,使用同样的程序,将其中的获取时间这一块的代码使用timeval 和timeb,timeval打印出来的log 时间居然不正确,这个不明白是为什么?

使用timeval:

01-04 07:23:32.947 JA310-1881 user.info shift: [271 | 285]: Element::bufferReturned: buf id=21, element id=2
01-04 07:23:32.948 JA310-1881 user.info shift: [271 | 285]: BufferGroup::returnBuffer: buf id=21
01-04 07:23:32.949 JA310-1881 user.info shift: [271 | 285]: StreamFlow::releaseCallbackBuffer: done
01-04 07:23:32.949 JA310-1881 user.info JMF-Media: [1186 | 1188]: releaseBuffer id = [21], ret = [0] 
01-04 07:23:32.113 JA310-1881 user.info shift: [271 | 1207]: MediaFileReader::threadLoop end mLoopInterval(66666)
01-04 07:23:32.113 JA310-1881 user.info shift: [271 | 1207]: Element::bufferReturned: buf id=4, element id=1
01-04 07:23:32.113 JA310-1881 user.info shift: [271 | 1207]: MediaFileReader::returnBuffer, buf id=4
01-04 07:23:32.113 JA310-1881 user.info shift: [271 | 1207]: BufferGroup::returnBuffer: buf id=4
01-04 07:23:32.113 JA310-1881 user.info shift: [271 | 1207]: MediaFileReader::threadLoop

注意第四行和第五行,不知道什么鬼,时间会从949变成113。

 

而使用timeb 打印之后的log 时间是正常的。

 

 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

私房菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值