localtime函式在不同平台使用注意

2021-09-03 07:17:01 字數 2751 閱讀 1391

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...