Linux编程--获取当前时间

背景

最近在重新编译ijkplayer,并且希望能够打印出来各个阶段的时间,以便对于ijkplayer进一步调优

获取时间

Linux获取时间有多种方案,都需要添加#include <time.h>

  1. time调用
    通过time函数获得当前时间,注意单位为秒,其中time_t结构体是一个有符号的长整型。
    ctime是一个返回格式化好的字符串的指针。格式为Thu Nov 24 18:22:48 1986\n\0
#include <time.h>
int main()
{
  time_t timep;
  time (&timep);
  printf(“%s”,ctime(&timep));
  return 0;
}
  1. gettimeofday调用
    通过gettimeofday调用返回来的是一个timeval的结构体,其中tv_sec是秒数,tv_usec是微秒数,通过这两个数共同标志当前时间
#ifndef _STRUCT_TIMEVAL
#define _STRUCT_TIMEVAL        struct timeval
_STRUCT_TIMEVAL
{
    __darwin_time_t         tv_sec;         /* seconds */
    __darwin_suseconds_t    tv_usec;        /* and microseconds */
};
#endif /* _STRUCT_TIMEVAL */

该函数的使用如下

#include <sys/time.h>

int main(void)
{
  struct timeval time;
  gettimeofday(&time, NULL);
  printf("Current Time Seconds: %ld,uSeconds:%ld\n", time.tv_sec,time.tv_usec);
  return 0;
}

注意

因为在手机上测试的时候,通过gettimeofday获取时间,并且通过网上t.tv_sec*1000+t.tv_usec/1000来计算毫秒数,结果得到的时间错误。而原因就是32位的系统上,long占四个字节,超出2^32则会溢出,导致结果错误。

比如,当前通过gettimeofday获取到的t.tv_sec为1534132538,而t.tv_sec*1000的结果为8292133328。

原因是:
1534132538的二进制为:
1011011011100010000000100111010
1534132538000的二进制为:
10110010100110001011011001100101010010000
而在32位的机器上,long最多占用32,所以得到的32位二进制如下:
00110001011011001100101010010000
转成10进制就是:
829213328
所以,64位的CPU可以进行该运算,32位的会因为溢出导致值不对

最终的解决方案是,通过long long类型的数据结构来保存,long long 占8个字节,也就是最大值为2^64:

long long gettime(){
     struct timeval tv;
     gettimeofday(&tv,NULL);
     long long seconds=tv.tv_sec; // 先将tv.tv_sec保存成long long类型
     return seconds*1000+tv.tv_usec/1000;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,930评论 25 708
  • 在《向往的生活》中,被Herry和黄老师的一段话震惊了,Herry说自己的已经八年没有谈恋爱,爱过人了;并且他说自...
    烟瑾_Shelly阅读 1,370评论 1 2
  • 〖每日拔拔草〗三度思维空性 公司的天猫交给姐夫经营,结果销量打不到五十万,评分低于4.7的天数超过114天,旗舰将...
    lindacheng2017阅读 203评论 1 1
  • 汉水清风拂旧尘,与卿携饮一壶春。 初逢长恨流光转,犹向斜辉寄此身。
    紫风铃_阅读 763评论 27 37
  • 《欲借》欲借嵯峨万仞崇,故将工巧状层峰。数寻苍色如烟合,一片盘根似藓封。院宇接连常藉竹,池亭掩映却凭松。分明装出依...
    墨影teresa阅读 1,372评论 7 5