1.寫在前面
localtime函式是c語言標準庫中時間庫「time.h」中獲取系統帶時區時間的函式,獲得的時間最終以「strcut tm」的格式輸出。對於通用作業系統如windows、linux中呼叫該函式,那麼獲得的時間就是帶時區的,這一點毫無疑問。而在一些嵌入式場合,我們也會面臨將時間戳轉換成「年月日時分秒」格式,如st早期的stm32 rtc就是只提供乙個時間戳計時器;假若不額外自行編寫換算函式,也是可以使用「輪子」,直接呼叫該函式的。在以往開發非聯網或者國內使用時,並未在意到時區問題;在實際論證下,有些嵌入式場合localtime獲得的時間並不帶時區,如mcu直接呼叫。
2.localtime呼叫
時間庫中與localtime對應,獲取不帶時區的系統時間函式是「gmtime」,下面在windows和linux平台下對比兩者情況。另外,對於衍生localtime(gmtime)函式localtime_r、localtime_s用法是一樣的,只是localtime_r和localtime_s是可重入函式,前者用於linux平台,後者用於windows平台。
2.1 localtime windows呼叫
編譯工具為vs2015,**如下。
#include "stdafx.h"
#include "time.h"
#include "stdio.h"
int main(int argc, char **argv)
; struct tm time_sct;
time_cnt = time(null);
printf("time_cnt=%d\n", time_cnt);
gmtime_s(&time_sct,&time_cnt);
printf("call gmtime, the time is:%d-%d-%d %d:%d:%d\n", time_sct.tm_year - 100, time_sct.tm_mon + 1, time_sct.tm_mday, time_sct.tm_hour, time_sct.tm_min, time_sct.tm_sec);
localtime_s(&time_sct,&time_cnt);
printf("call localtime, the time is:%d-%d-%d %d:%d:%d\n", time_sct.tm_year - 100, time_sct.tm_mon + 1, time_sct.tm_mday, time_sct.tm_hour, time_sct.tm_min, time_sct.tm_sec);
getchar();
return 0;
}
執行結果如圖,兩者相差8小時,說明localtime已經帶了時區執行。
2.2 localtime linux呼叫
編輯器用vi,編譯器為g++,原始碼如下。
#include #include int main(int argc, char **argv)
; struct tm *time_sct = null;
time_cnt = time(null);
printf("time_cnt=%d\n", time_cnt);
time_sct = gmtime(&time_cnt);
printf("call gmtime, the time is:%d-%d-%d %d:%d:%d\n", time_sct->tm_year-100,time_sct->tm_mon+1,time_sct->tm_mday,time_sct->tm_hour, time_sct->tm_min, time_sct->tm_sec);
time_sct = localtime(&time_cnt);
printf("call localtime, the time is:%d-%d-%d %d:%d:%d\n",time_sct->tm_year-100,time_sct->tm_mon+1,time_sct->tm_mday,time_sct->tm_hour, time_sct->tm_min, time_sct->tm_sec);
return 0;
}
執行結果如圖,與windows一致,也驗證了localtime的時區計算功能。
2.3 嵌入平台呼叫
在嵌入式mcu上執行,分別在裸機和freertos中呼叫,**與上述一致,通過串列埠列印時間。得出的結果如下圖。
實際證明,兩者函式執行結果一致,帶時區功能的localtime並沒有實現時區轉換,此時的時間都是utc時間,即0時區的時間。另外,也可以將列印的時間戳(1545002474)通過轉換工具轉換驗證,得到的北京時間是比上圖中的時間快8小時,證實上面時間是0時區時間。
2.4 其他嵌入平台
其他嵌入式平台暫未驗證,如嵌入式linux、各類rtos等。在實際應用中,如涉及到時區時,使用時間(time)庫函式時需格外注意。
3. 結論
在嵌入式平台下呼叫時間庫函式,需注意時區問題。
標準函式time 和localtime
1.time 函式 返回1970 1 1,00 00 00以來經過的秒數 原型 time t time time t calptr 結果可以通過返回值,也可以通過引數得到,見例項 標頭檔案 返回值 成功 秒數,從1970 1 1,00 00 00 可以當成整型輸出或用於其它函式 失敗 1 例 tim...
localtime和gmtime函式的區別
c庫函式time t time time t seconds 返回自紀元 00 00 00 utc,1970年1月1日 以來的時間,單位為秒。如果second不是null,則返回值也儲存在變數second中。time t time time t t c庫函式tm localtime const ti...
localtime函式可以實現獲取時間資訊
localtime函式,根據它所在的上下文,可以用兩種完全不同的方法來執行。在標量上下文中,localtime函式返回乙個格式化很好的當前時間字串。例如,print scalar localtime 這個 它輸出的結果將類似於thu sep 16 23 00 06 1999。在列表上下文中,loca...