localtime、localtime_s、localtime_r的區別和使用方法

localtime、localtime_s、localtime_r都是用於獲取系統時間,其中localtime_r用於Linux平臺下獲取系統時間,localtime_s用於Windows平臺獲取系統時間,而localtime獲取系統時間不區分系統。既然有了localtime爲什麼還需要localtime_s和localtime_r呢?
先來看看localtime函數原型:struct tm *localtime(const time_t * timep),如果我同時有三個time_t類型的時間需要轉爲系統時間的格式,如下:
struct tm *pAlarmTime, *pStartTime, *pEndTime;
time_t tAlarmTime = atoll(szAlarmTime);
time_t tStartTime = atoll(szStartTmie);
time_t tEndTime = atoll(szEndTime);
pAlarmTime = localtime(&tAlarmTime);
pStartTime = localtime( &tStartTime);
pEndTime = localtime(&tEndTime);
實際運行中發現,在執行pAlarmTime = localtime(&tAlarmTime)語句時時,pAlarmTime指針所指的內容是正常的,但是執行到後面的語句時,pAlarmTime指針值會受到影響。這是因爲localtime在使用時,我們只需定義一個指針,並不需要爲指針申請空間,而指針必須要指向內存空間纔可以使用,其實申請空間的動作由函數自己完成,這樣在多線程的情況下,如果有另一個線程調用了這個函數,那麼指針指向的struct tm結構體的數據就會改變。在上面的例子中,我們定義了3個指針,實際指向的是同一個內存地址,這樣導致不能得到三個獨立的時間。
Windows環境下,改成下面的就正常了:
time_t tAlarmTime = atoll(szAlarmTime);
time_t tStartTime = atoll(szStartTmie);
time_t tEndTime = atoll(szEndTime);
struct tm tmAlarmTime, tmStartTime, tmEndTime;
localtime_s(&tmAlarmTime,&tAlarmTime);
localtime_s(&tmStartTime, &tStartTime);
localtime_s(&tmEndTime, &tEndTime);

Linux下的使用就不舉例了。
總結,在不涉及多線程,且只有一個系統時間的情況下,比如獲取系統當前時間,使用localtime即可;但是在需要將多個時間轉化爲系統時間的格式,或者是多線程中使用時,應該根據系統類型選擇使用localtime_s或localtime_r。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章