Linux編程--獲取當(dāng)前時(shí)間

背景

最近在重新編譯ijkplayer,并且希望能夠打印出來(lái)各個(gè)階段的時(shí)間,以便對(duì)于ijkplayer進(jìn)一步調(diào)優(yōu)

獲取時(shí)間

Linux獲取時(shí)間有多種方案,都需要添加#include <time.h>

  1. time調(diào)用
    通過(guò)time函數(shù)獲得當(dāng)前時(shí)間,注意單位為秒,其中time_t結(jié)構(gòu)體是一個(gè)有符號(hào)的長(zhǎng)整型。
    ctime是一個(gè)返回格式化好的字符串的指針。格式為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調(diào)用
    通過(guò)gettimeofday調(diào)用返回來(lái)的是一個(gè)timeval的結(jié)構(gòu)體,其中tv_sec是秒數(shù),tv_usec是微秒數(shù),通過(guò)這兩個(gè)數(shù)共同標(biāo)志當(dāng)前時(shí)間
#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 */

該函數(shù)的使用如下

#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;
}

注意

因?yàn)樵谑謾C(jī)上測(cè)試的時(shí)候,通過(guò)gettimeofday獲取時(shí)間,并且通過(guò)網(wǎng)上t.tv_sec*1000+t.tv_usec/1000來(lái)計(jì)算毫秒數(shù),結(jié)果得到的時(shí)間錯(cuò)誤。而原因就是32位的系統(tǒng)上,long占四個(gè)字節(jié),超出2^32則會(huì)溢出,導(dǎo)致結(jié)果錯(cuò)誤。

比如,當(dāng)前通過(guò)gettimeofday獲取到的t.tv_sec為1534132538,而t.tv_sec*1000的結(jié)果為8292133328。

原因是:
1534132538的二進(jìn)制為:
1011011011100010000000100111010
1534132538000的二進(jìn)制為:
10110010100110001011011001100101010010000
而在32位的機(jī)器上,long最多占用32,所以得到的32位二進(jìn)制如下:
00110001011011001100101010010000
轉(zhuǎn)成10進(jìn)制就是:
829213328
所以,64位的CPU可以進(jìn)行該運(yùn)算,32位的會(huì)因?yàn)橐绯鰧?dǎo)致值不對(duì)

最終的解決方案是,通過(guò)long long類型的數(shù)據(jù)結(jié)構(gòu)來(lái)保存,long long 占8個(gè)字節(jié),也就是最大值為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;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,281評(píng)論 25 708
  • 在《向往的生活》中,被Herry和黃老師的一段話震驚了,Herry說(shuō)自己的已經(jīng)八年沒(méi)有談戀愛(ài),愛(ài)過(guò)人了;并且他說(shuō)自...
    煙瑾_Shelly閱讀 1,543評(píng)論 1 2
  • 〖每日拔拔草〗三度思維空性 公司的天貓交給姐夫經(jīng)營(yíng),結(jié)果銷量打不到五十萬(wàn),評(píng)分低于4.7的天數(shù)超過(guò)114天,旗艦將...
    lindacheng2017閱讀 234評(píng)論 1 1
  • 漢水清風(fēng)拂舊塵,與卿攜飲一壺春。 初逢長(zhǎng)恨流光轉(zhuǎn),猶向斜輝寄此身。
    紫風(fēng)鈴_閱讀 901評(píng)論 27 39
  • 《欲借》欲借嵯峨萬(wàn)仞崇,故將工巧狀層峰。數(shù)尋蒼色如煙合,一片盤根似蘚封。院宇接連常藉竹,池亭掩映卻憑松。分明裝出依...
    墨影teresa閱讀 1,438評(píng)論 7 5

友情鏈接更多精彩內(nèi)容