寫代碼的過程中,經常要使用C標准庫中的一些函數,比如時間相關的函數,每次使用都要去查文檔,雖然經常用,但是也沒有總結過,以至於每次使用時,還是沒有辦法一次搞定,為了搞定這個時間操作的問題,就總結了這麼一篇文章,就是一個總結,以後再寫時間操作相關的代碼時,不查文檔,一次搞定。
現在工作的環境都是Linux,對於時間操作,也就是使用C標准庫中的幾個函數,如下所示:
這些函數對應的頭文件是<ctime>
和 <time.h>
。這些函數都存在一定的聯系的,如下圖所示:
我一般怎麼用這幾個函數呢?首先調用time
函數獲得一個當前時間距離UTC時間1970年1月1日的秒數,這個函數返回一個time_t
類型的值,說白了就是一個整型值;得到這個值以後,我們就可以進行接下來的任何操作了。
ctime
函數就可以直接搞定;ctime
函數會返回例如下述格式的一個字符串:
Wed Feb 13 16:06:10 2013
localtime
或者gmtime
函數就可以搞定了(localtime
返回本地時間信息;gmtime
返回UTC時間信息),localtime
或者gmtime
函數返回一個struct tm
類型的結構體,你要的字段信息都在裡面,去看看吧。snprintf
一樣,非常強大。關於%d
、%s
…這些東西,就看文檔去吧。看個簡單的代碼示例吧,最感性的還是代碼。
#include <iostream>#include <ctime>using namespace std;int main(){
time_t rawTime;
rawTime = time(NULL);
if (rawTime == -1)
{
return 0;
}
cout<<"Now is:"<<ctime(&rawTime)<<endl;
struct tm *timeInfo;
timeInfo = localtime(&rawTime);
cout<<"Now is:"<<asctime(timeInfo)<<endl;
cout<<"Year:"<<timeInfo->tm_year + 1900<<endl;
cout<<"Month:"<<timeInfo->tm_mon + 1<<endl;
cout<<"Day:"<<timeInfo->tm_mday<<endl;
char buff[256] = {0};
strftime(buff, sizeof(buff) / sizeof(buff[0]), "今天是%Y年%m月%d日", timeInfo);
cout<<buff<<endl;
return 0;}
例子太簡單了,不想分析。
從文檔中可以看到以下函數的聲明:
上述四個函數都是返回一個指針類型的值,那麼問題來了,這個指針指向的是哪塊內存呢?
首先需要確定的是,這幾個函數返回的指針指向的內存不是我們開辟或定義的。庫自己開辟的?是的,沒錯,庫自己搞了一塊內存。然後文檔中也詳細的說了,調用這四個函數不是線程安全的,明白了麼?你剛剛得到的struct tm
值,可能在另一個線程中被別人修改了。所以,使用之前,想清楚喽!!!
這些小的知識點在日常開發工作中經常會使用到,也是留意最少的地方,而也是這些小地方容易出現問題,不積跬步無以至千裡,只有積累多了,當真的出現問題時,也能從容應對。