以前經(jīng)常在程序中獲取系統(tǒng)時(shí)間,計(jì)算時(shí)間,但是每次都是到網(wǎng)上臨時(shí)找來(lái)一些資料對(duì)付過(guò)去,今天就索性整理一下。 關(guān)于C語(yǔ)言time.h的一些應(yīng)用。 clock_t clock(void); //得到從進(jìn)程啟動(dòng)到此次函數(shù)調(diào)用的累計(jì)的時(shí)鐘滴答數(shù)。每秒包含CLOCKS_PER_SEC(time.h中定義的常量,一般為1000,貌似linux下為1000000)個(gè)時(shí)鐘滴答。時(shí)鐘滴答數(shù)用數(shù)據(jù)類型clock_t表示。clock_t類型一般是32位整數(shù)類型。 time_t time(time_t* timer); //得到從標(biāo)準(zhǔn)計(jì)時(shí)點(diǎn)(一般是1970年1月1日0時(shí)0秒)到當(dāng)前時(shí)間的秒數(shù)。日歷時(shí)間用數(shù)據(jù)類型time_t表示。time_t類型實(shí)際上一般是32位或64位整數(shù)類型。 分解時(shí)間同結(jié)構(gòu)體類型表示tm表示: struct tm { int tm_hour; //時(shí) 0~23 int tm_isdst; //夏令時(shí)是否開啟 開啟(> 0),關(guān)閉(= 0),未知(< 0) int tm_mday; //日 0~31 int tm_min; //分 0~59 int tm_mon; //月 0~11 int tm_sec; //秒 0~60(60為天文學(xué)中定義的閏秒) int tm_wday; //星期,從星期天計(jì) 0~6 int tm_yday; //本年經(jīng)過(guò)的天數(shù) 0~365 int tm_year; //從1900年起經(jīng)過(guò)的年數(shù) }; struct tm* gmtime(const time_t* timer); //從日歷時(shí)間time_t到分解時(shí)間tm的轉(zhuǎn)換。函數(shù)返回的是一個(gè)靜態(tài)分配的tm結(jié)構(gòu)存儲(chǔ)空間,該存儲(chǔ)空間被gmtime,localtime與ctime函數(shù)所共用. 這些函數(shù)的每一次調(diào)用會(huì)覆蓋這塊tm結(jié)構(gòu)存儲(chǔ)空間的內(nèi)容。 struct tm* gmtime_r(const time_t* timer , struct tm*result); //該函數(shù)是gmtime函數(shù)的線程安全版本 struct tm* localtime(const time_t* timer); //從日歷時(shí)間time_t到分解時(shí)間tm的轉(zhuǎn)換,即結(jié)果數(shù)據(jù)已經(jīng)調(diào)整到本地時(shí)區(qū)與夏令時(shí)。 time_t mktime(struct tm* ptm); //從分解時(shí)間tm到日歷時(shí)間time_t的轉(zhuǎn)換。 time_t timegm(struct tm* brokentime); //從分解時(shí)間tm(被視作UTC時(shí)間,不考慮本地時(shí)區(qū)設(shè)置)到日歷時(shí)間time_t的轉(zhuǎn)換。該函數(shù)較少被使用。 double difftime(time_t timer2, time_t timer1); //比較兩個(gè)日歷時(shí)間,返回double類型的秒數(shù)差。似乎用處不大,time_t可以直接相減
以下是幾個(gè)把日期數(shù)據(jù)按常用格式輸出的函數(shù): char *asctime(const struct tm* tmptr); //把分解時(shí)間tm輸出到字符串,結(jié)果的格式為"Www Mmm dd hh:mm:ss yyyy",即“周幾 月份數(shù) 日數(shù) 小時(shí)數(shù):分鐘數(shù):秒鐘數(shù) 年份數(shù)”。函數(shù)返回的字符串為靜態(tài)分配,長(zhǎng)度不大于26,與ctime函數(shù)共用。函數(shù)的每次調(diào)用將覆蓋該字符串內(nèi)容。 char* ctime(const time_t* timer); //把日歷時(shí)間time_t timer輸出到字符串,輸出格式與asctime函數(shù)一樣。 size_t strftime(char* s, size_t n, const char* format, const struct tm* tptr); //把分解時(shí)間tm轉(zhuǎn)換為自定義格式的字符串,類似于常見的字符串格式輸出函數(shù)sprintf。 char * strptime(const char* buf, const char* format, struct tm* tptr); //strftime的逆操作,把字符串按照自定義的格式轉(zhuǎn)換為分解時(shí)間tm。恩恩……這個(gè)函數(shù)還是比較有意思的。 其中上面的自定義格式字符串類型有自己的格式命令符,相當(dāng)多,請(qǐng)讀者自己查閱。 下面是我寫的代碼: //取按下回車前后的系統(tǒng)時(shí)間,并計(jì)算時(shí)間差 1 #include<stdio.h> 運(yùn)行結(jié)果: |
|