Linux下用C獲取當(dāng)前時(shí)間
Linux下用C獲取當(dāng)前時(shí)間,具體如下:
代碼(可以把clock_gettime換成time(NULL))
void getNowTime() { timespec time; clock_gettime(CLOCK_REALTIME, &time); //獲取相對(duì)于1970到現(xiàn)在的秒數(shù) tm nowTime; localtime_r(&time.tv_sec, &nowtime); char current[1024]; sprintf(current, "%04d%02d%02d%02d:%02d:%02d", nowTime.tm_year + 1900, nowTime.tm_mon, nowTime.tm_mday, nowTime.tm_hour, nowTime.tm_min, nowTime.tm_sec); }
分析:
clock_gettime()
函數(shù)"clock_gettime"是基于Linux C語(yǔ)言的時(shí)間函數(shù),他可以用于計(jì)算精度和納秒。
語(yǔ)法:
#include<time.h> int clock_gettime(clockid_t clk_id,struct timespec *tp);
參數(shù):
clk_id : 檢索和設(shè)置的clk_id指定的時(shí)鐘時(shí)間。
CLOCK_REALTIME:系統(tǒng)實(shí)時(shí)時(shí)間,隨系統(tǒng)實(shí)時(shí)時(shí)間改變而改變,即從UTC1970-1-1 0:0:0開始計(jì)時(shí),中間時(shí)刻如果系統(tǒng)時(shí)間被用戶改成其他,則對(duì)應(yīng)的時(shí)間相應(yīng)改變
- CLOCK_MONOTONIC:從系統(tǒng)啟動(dòng)這一刻起開始計(jì)時(shí),不受系統(tǒng)時(shí)間被用戶改變的影響
- CLOCK_PROCESS_CPUTIME_ID:本進(jìn)程到當(dāng)前代碼系統(tǒng)CPU花費(fèi)的時(shí)間
- CLOCK_THREAD_CPUTIME_ID:本線程到當(dāng)前代碼系統(tǒng)CPU花費(fèi)的時(shí)間
struct timespec { time_t tv_sec; /* 秒*/ long tv_nsec; /* 納秒*/ };
localtime()
localtime是 把從1970-1-1零點(diǎn)零分到當(dāng)前時(shí)間系統(tǒng)所偏移的秒數(shù)時(shí)間轉(zhuǎn)換為本地時(shí)間.
語(yǔ)法
說(shuō)明:此函數(shù)獲得的tm結(jié)構(gòu)體的時(shí)間是日歷時(shí)間。
用 法: struct tm *localtime(const time_t *clock);
返回值:返回指向tm 結(jié)構(gòu)體的指針.tm結(jié)構(gòu)體是time.h中定義的用于分別存儲(chǔ)時(shí)間的各個(gè)量(年月日等)的結(jié)構(gòu)體.
例1:
#include <stdio.h> #include <stddef.h> #include <time.h> int main(void) { time_t timer;//time_t就是long int 類型 struct tm *tblock; timer = time(NULL); tblock = localtime(&timer); printf("Local time is: %s\n", asctime(tblock)); return 0; }
執(zhí)行結(jié)果:
Local time is: Mon Feb 16 11:29:26 2009
例2:
上面的例子用了asctime函數(shù),下面這個(gè)例子不使用這個(gè)函數(shù)一樣能獲取系統(tǒng)當(dāng)前時(shí)間。需要注意的是年份加上1900,月份加上1。
#include<time.h> #include<stdio.h> int main() { struct tm *t; time_t tt; time(&tt); t = localtime(&tt); printf("%4d年%02d月%02d日 %02d:%02d:%02d\n", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); return 0; }
localtime()與localtime_r()的區(qū)別
localtime():
#include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main(int argc, char *argv[]) { time_t tNow =time(NULL); time_t tEnd = tNow + 1800; //注意下面兩行的區(qū)別 struct tm* ptm = localtime(&tNow); struct tm* ptmEnd = localtime(&tEnd); char szTmp[50] = {0}; strftime(szTmp,50,"%H:%M:%S",ptm); char szEnd[50] = {0}; strftime(szEnd,50,"%H:%M:%S",ptmEnd); printf("%s /n",szTmp); printf("%s /n",szEnd); system("PAUSE"); return EXIT_SUCCESS; }
最后出來(lái)的結(jié)果是:
21:18:39
21:18:39
和最初想法不一致。
查閱localtime的文檔,發(fā)現(xiàn)這段話:
This structure is statically allocated and shared by the functions gmtime and localtime. Each time either one of these functions is called the content of this structure is overwritten.
也就是說(shuō)每次只能同時(shí)使用localtime()函數(shù)一次,要不就會(huì)被重寫!
The localtime() function need not be reentrant. A function that is not required to be reentrant is not required to be thread-safe.
因此localtime()不是可重入的。同時(shí)libc里提供了一個(gè)可重入版的函數(shù)localtime_r();
Unlike localtime(), the reentrant version is not required to set tzname。
修改程序:(localtime_r())
#include <cstdlib> #include <iostream> #include <time.h> #include <stdio.h> using namespace std; int main(int argc, char *argv[]) { time_t tNow =time(NULL); time_t tEnd = tNow + 1800; //在這里修改程序 //struct tm* ptm = localtime(&tNow); //struct tm* ptmEnd = localtime(&tEnd); struct tm ptm = { 0 }; struct tm ptmEnd = { 0 }; localtime_r(&tNow, &ptm); localtime_r(&tEnd, &ptmEnd); char szTmp[50] = {0}; strftime(szTmp,50,"%H:%M:%S",&ptm); char szEnd[50] = {0}; strftime(szEnd,50,"%H:%M:%S",&ptmEnd); printf("%s /n",szTmp); printf("%s /n",szEnd); system("PAUSE"); return EXIT_SUCCESS; }
最后出來(lái)的結(jié)果是:
10:29:06
10:59:06
tm
struct tm { int tm_sec; /* 秒 – 取值區(qū)間為[0,59] */ int tm_min; /* 分 - 取值區(qū)間為[0,59] */ int tm_hour; /* 時(shí) - 取值區(qū)間為[0,23] */ int tm_mday; /* 一個(gè)月中的日期 - 取值區(qū)間為[1,31] */ int tm_mon; /* 月份(從一月開始,0代表一月) - 取值區(qū)間為[0,11] */ int tm_year; /* 年份,其值等于實(shí)際年份減去1900 */ int tm_wday; /* 星期 – 取值區(qū)間為[0,6],其中0代表星期天,1代表星期一 */ int tm_yday; /* 從每年1月1日開始的天數(shù)– 取值區(qū)間[0,365],其中0代表1月1日 */ int tm_isdst; /* 夏令時(shí)標(biāo)識(shí)符,夏令時(shí)tm_isdst為正;不實(shí)行夏令時(shí)tm_isdst為0 */ };
time 函數(shù)
返回:1970-1-1, 00:00:00以來(lái)經(jīng)過(guò)的秒數(shù)
原型: time_t time(time_t *calptr)
結(jié)果可以通過(guò)返回值,也可以通過(guò)參數(shù)得到,見實(shí)例
頭文件 <time.h>
返回值:
成功:秒數(shù),從1970-1-1,00:00:00 可以當(dāng)成整型輸出或用于其它函數(shù)
失?。?1
例:
time_t now; time(&now);// 等同于now = time(NULL) printf("now time is %d\n", now);
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Apache2.4.2編譯安裝2個(gè)常見錯(cuò)誤和解決方法
這篇文章主要介紹了Apache2.4.2編譯安裝2個(gè)常見錯(cuò)誤和解決方法,需要的朋友可以參考下2014-06-06CentOS 7中 Apache Web 服務(wù)器安裝配置教程
這篇文章主要介紹了CentOS 7中 Apache Web 服務(wù)器安裝配置教程,需要的朋友可以參考下2018-04-04jmeter在linux系統(tǒng)下運(yùn)行及本地內(nèi)存調(diào)優(yōu)的方法詳解
這篇文章主要介紹了jmeter在linux系統(tǒng)下運(yùn)行及本地內(nèi)存調(diào)優(yōu)的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Ubuntu18.04安裝Nvidia顯卡驅(qū)動(dòng)教程(圖文)
這篇文章主要介紹了Ubuntu18.04安裝Nvidia顯卡驅(qū)動(dòng)教程(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07