@[toc]數據庫
freecplus是一個Linux系統下的C/C++開源框架,源代碼請前往C語言技術網(www.freecplus.net)下載。框架
本文介紹的是freecplus框架的時間操做函數。ide
函數和類的聲明文件是freecplus/_freecplus.h。函數
函數和類的定義文件是freecplus/_freecplus.cpp。操作系統
示例程序位於freecplus/demo目錄中。.net
編譯規則文件是freecplus/demo/makefile。code
UNIX操做系統根據計算機產生的年代和應用採用1970年1月1日做爲UNIX的紀元時間,1970年1月1日0點做爲計算機表示時間的是中間點,將從1970年1月1日開始通過的秒數用一個整數存放,這種高效簡潔的時間表示方法被稱爲「Unix時間紀元」,向左和向右偏移均可以獲得更早或者更後的時間。對象
在實際開發中,對日期和時間的操做場景很是多,例如程序啓動和退出的時間,程序執行任務的時間,數據生成的時間,數據處理的各環節的時間等等。blog
在Linux系統中,自定義了time_t類型,以下:圖片
typedef long time_t; // 時間值time_t爲長整型long的別名。
取操做系統的時間,並把整數表示的時間轉換爲字符串表示的格式。
函數聲明:
void LocalTime(char *out_stime,const char *in_fmt=0,const int in_interval=0);
參數說明:
stime:用於存放獲取到的時間字符串。
timetvl:時間的偏移量,單位:秒,0是缺省值,表示當前時間,30表示當前時間30秒以後的時間點,-30表示當前時間30秒以前的時間點。
fmt:輸出時間的格式,fmt每部分的含義:"yyyy"-年份;"mm"-月份;"dd"-日期;"hh24"-小時;"mi"-分鐘;"ss"-秒,缺省是"yyyy-mm-dd hh24:mi:ss",目前支持如下格式:
"yyyy-mm-dd hh24:mi:ss" "yyyymmddhh24miss" "yyyy-mm-dd" "yyyymmdd" "hh24:mi:ss" "hh24miss" "hh24:mi" "hh24mi" "hh24" "mi"
注意:
1)小時的表示方法是hh24,不是hh,這麼作的目的是爲了保持與數據庫的時間表示方法一致;
2)以上列出了經常使用的時間格式,若是不能知足您應用開發的需求,請修改源代碼timetostr函數增長更多的格式支持;
3)調用函數的時候,若是fmt與上述格式都匹配,stime的內容將爲空。
示例(demo24.cpp)
/* * 程序名:demo24.cpp,此程序演示freecplus框架中LocalTime時間函數的使用。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" int main() { char strtime[20]; memset(strtime,0,sizeof(strtime)); LocalTime(strtime,"yyyy-mm-dd hh24:mi:ss",-30); // 獲取30秒前的時間。 printf("strtime1=%s\n",strtime); LocalTime(strtime,"yyyy-mm-dd hh24:mi:ss"); // 獲取當前時間。 printf("strtime2=%s\n",strtime); LocalTime(strtime,"yyyy-mm-dd hh24:mi:ss",30); // 獲取30秒後的時間。 printf("strtime3=%s\n",strtime); }
函數聲明:
void timetostr(const time_t ltime,char *stime,const char *fmt=0);
參數說明:
ltime:整數表示的時間。
stime:字符串表示的時間。
fmt:輸出字符串時間stime的格式,與LocalTime函數的fmt參數相同,若是fmt的格式不正確,stime將爲空。
函數聲明:
time_t strtotime(const char *stime);
參數說明:
stime:字符串表示的時間,格式不限,但必定要包括yyyymmddhh24miss,一個都不能少。
返回值:整數表示的時間,若是stime的格式不正確,返回-1。
示例(demo26.cpp)
/* * 程序名:demo26.cpp,此程序演示freecplus框架中整數表示的時間和字符串表示的時間之間的轉換。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" int main() { time_t ltime; char strtime[20]; memset(strtime,0,sizeof(strtime)); strcpy(strtime,"2020-01-01 12:35:22"); ltime=strtotime(strtime); // 轉換爲整數的時間 printf("ltime=%ld\n",ltime); // 輸出ltime=1577853322 memset(strtime,0,sizeof(strtime)); timetostr(ltime,strtime,"yyyy-mm-dd hh24:mi:ss"); // 轉換爲字符串的時間 printf("strtime=%s\n",strtime); // 輸出strtime=2020-01-01 12:35:22 }
把字符串表示的時間加上一個偏移的秒數後獲得一個新的字符串表示的時間。
函數聲明:
bool AddTime(const char *in_stime,char *out_stime,const int timetvl,const char *fmt=0);
參數說明:
in_stime:輸入的字符串格式的時間。
out_stime:輸出的字符串格式的時間。
timetvl:須要偏移的秒數,正數日後偏移,負數往前偏移。
fmt:輸出字符串時間out_stime的格式,與LocalTime函數的fmt參數相同。
注意:in_stime和out_stime參數能夠是同一個變量的地址,若是調用失敗,out_stime的內容會清空。
返回值:true-成功,false-失敗,若是返回失敗,能夠認爲是in_stime的格式不正確。
示例(demo28.cpp)
/* * 程序名:demo28.cpp,此程序演示freecplus框架中採用AddTime進行時間的運算。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" int main() { time_t ltime; char strtime[20]; memset(strtime,0,sizeof(strtime)); strcpy(strtime,"2020-01-01 12:35:22"); AddTime(strtime,strtime,0-1*24*60*60); // 減一天。 printf("strtime=%s\n",strtime); // 輸出strtime=2019-12-31 12:35:22 AddTime(strtime,strtime,2*24*60*60); // 加兩天。 printf("strtime=%s\n",strtime); // 輸出strtime=2020-01-02 12:35:22 }
CTimer類是一個精確到微秒的計時器。
類聲明:
// 這是一個精確到微秒的計時器。 class CTimer { private: struct timeval m_start; // 開始計時的時間。 struct timeval m_end; // 計時完成的時間。 // 開始計時。 void Start(); public: CTimer(); // 構造函數中會調用Start方法。 // 計算已逝去的時間,單位:秒,小數點後面是微秒。 double Elapsed(); };
CTimer建立對象後當即開始計時,每次調用Elapsed方法獲取已逝去的時間(單位:秒,小數點後面是微秒),並從新開始計時。
示例(demo29.cpp)
/* * 程序名:demo29.cpp,此程序演示freecplus框架中的CTimer類(計時器)的用法。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" int main() { CTimer Timer; printf("elapsed=%lf\n",Timer.Elapsed()); sleep(1); printf("elapsed=%lf\n",Timer.Elapsed()); sleep(1); printf("elapsed=%lf\n",Timer.Elapsed()); usleep(1000); printf("elapsed=%lf\n",Timer.Elapsed()); usleep(100); printf("elapsed=%lf\n",Timer.Elapsed()); sleep(10); printf("elapsed=%lf\n",Timer.Elapsed()); }
運行效果
從demo29運行的效果上看,好像計時有偏差,一樣是睡1秒,實際耗時倒是1.000126或1.000171,這是由於程序自己執行須要時間,雖然時間很短,那也是須要時間。
C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道
若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!