美文网首页
Linux编程--获取当前时间

Linux编程--获取当前时间

作者: None_Ling | 来源:发表于2018-08-13 15:13 被阅读80次

    背景

    最近在重新编译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;
    }
    

    相关文章

      网友评论

          本文标题:Linux编程--获取当前时间

          本文链接:https://www.haomeiwen.com/subject/zmgybftx.html