之前一篇博文对 time.h 进行了解读,但是如果需要时间精确到毫秒,time_t、tm还是无法满足的,需要另外一种方式。
#include
struct timespec
{
__time_t tv_sec; /* Seconds. */
__syscall_slong_t tv_nsec; /* Nanoseconds. */
}
time.h 中有结构体timespec,这里精确到ns
#include
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
struct timezone
{
int tz_minuteswest; /* Minutes west of GMT. */
int tz_dsttime; /* Nonzero if DST is ever in effect. */
};
#include
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 时间是正常的。