一、先從結構體看起
struct tm
{
int tm_sec; /* 秒 – 取值區間為[0,59] /
int tm_min; / 分 - 取值區間為[0,59] /
int tm_hour; / 時 - 取值區間為[0,23] /
int tm_mday; / 一個月中的日期 - 取值區間為[1,31] /
int tm_mon; / 月份(從一月開始,0代表一月) - 取值區間為[0,11] /
int tm_year; / 年份,其值等于實際年份減去1900 /
int tm_wday; / 星期 – 取值區間為[0,6],其中0代表星期天,1代表星期一,以此類推 /
int tm_yday; / 從每年的1月1日開始的天數 – 取值區間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 /
int tm_isdst; / 夏令時標識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不了解情況 時,tm_isdst()為負。*/
};
月份為0-11
年份又是從1900年開始
星期又是0~6
time_t
time_t卻是從1970/1/1 000開始的秒數
二、再從重點轉換函數看起
timegm()和gmtime_r()
timegm()是將struct tm結構體轉換為time_t,直接時間計算
gmtime_r()是將time_t轉換為struct tm結構體數據
mktime()和localtime_r()
mktime先調用timegm()轉換為time_t,再減去時區
localtime_r()先加上時區值,再調用gmtime_r()轉換為結構體
三、再談time格式化字符:
ctime(),ctime_r(),asctime()最終都是調用asctime_r()
四、再從底層驅動看起,
1.實際的硬件時間:
-# 實際年份-1900年-100的年份 = 實際年份-2000年,
-# 其他時間為本地時分秒
相當于本地時間:2023/11/23 19:03:00 實際存儲到硬件為23/11/23 19:03:00
在網上搜到一篇文章,就說的windows和linux系統硬件存儲的實際時間也是本地時間
五、硬件時間轉換與timestamp相互轉換
在get_rtc_timestamp中mktime()將底層硬件時間(帶時區)轉換為相對1970/1/1 000的秒數(不帶時區),
重點:mktime()將struct tm * t結構時間減去時區值
在set_rtc_time_stamp中localtime()將相對1970/0/0 000的秒數(不帶時區)轉換為struct tm結構體數據(帶時區)
六、time()和stime函數
time()調用_control_rtc()→最終調用get_rtc_timestamp()
stime函數調用_control_rtc()→最終調用set_rtc_timestamp()
總結:
底層硬件時間與tm結構體時間都是有區別,各處應使用tm結構體時間(應為1900年到現在的時間)
-
Linux系統
+關注
關注
4文章
593瀏覽量
27397 -
RTC
+關注
關注
2文章
538瀏覽量
66529 -
STM32L4
+關注
關注
1文章
42瀏覽量
9413
發布評論請先 登錄
相關推薦
評論