一、先從結(jié)構(gòu)體看起
struct tm
{
int tm_sec; /* 秒 – 取值區(qū)間為[0,59] /
int tm_min; / 分 - 取值區(qū)間為[0,59] /
int tm_hour; / 時 - 取值區(qū)間為[0,23] /
int tm_mday; / 一個月中的日期 - 取值區(qū)間為[1,31] /
int tm_mon; / 月份(從一月開始,0代表一月) - 取值區(qū)間為[0,11] /
int tm_year; / 年份,其值等于實際年份減去1900 /
int tm_wday; / 星期 – 取值區(qū)間為[0,6],其中0代表星期天,1代表星期一,以此類推 /
int tm_yday; / 從每年的1月1日開始的天數(shù) – 取值區(qū)間為[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開始的秒數(shù)
二、再從重點轉(zhuǎn)換函數(shù)看起
timegm()和gmtime_r()
timegm()是將struct tm結(jié)構(gòu)體轉(zhuǎn)換為time_t,直接時間計算
gmtime_r()是將time_t轉(zhuǎn)換為struct tm結(jié)構(gòu)體數(shù)據(jù)
mktime()和localtime_r()
mktime先調(diào)用timegm()轉(zhuǎn)換為time_t,再減去時區(qū)
localtime_r()先加上時區(qū)值,再調(diào)用gmtime_r()轉(zhuǎn)換為結(jié)構(gòu)體
三、再談time格式化字符:
ctime(),ctime_r(),asctime()最終都是調(diào)用asctime_r()
四、再從底層驅(qū)動看起,
1.實際的硬件時間:
-# 實際年份-1900年-100的年份 = 實際年份-2000年,
-# 其他時間為本地時分秒
相當于本地時間:2023/11/23 19:03:00 實際存儲到硬件為23/11/23 19:03:00
在網(wǎng)上搜到一篇文章,就說的windows和linux系統(tǒng)硬件存儲的實際時間也是本地時間
五、硬件時間轉(zhuǎn)換與timestamp相互轉(zhuǎn)換
在get_rtc_timestamp中mktime()將底層硬件時間(帶時區(qū))轉(zhuǎn)換為相對1970/1/1 000的秒數(shù)(不帶時區(qū)),
重點:mktime()將struct tm * t結(jié)構(gòu)時間減去時區(qū)值
在set_rtc_time_stamp中l(wèi)ocaltime()將相對1970/0/0 000的秒數(shù)(不帶時區(qū))轉(zhuǎn)換為struct tm結(jié)構(gòu)體數(shù)據(jù)(帶時區(qū))
六、time()和stime函數(shù)
time()調(diào)用_control_rtc()→最終調(diào)用get_rtc_timestamp()
stime函數(shù)調(diào)用_control_rtc()→最終調(diào)用set_rtc_timestamp()
總結(jié):
底層硬件時間與tm結(jié)構(gòu)體時間都是有區(qū)別,各處應(yīng)使用tm結(jié)構(gòu)體時間(應(yīng)為1900年到現(xiàn)在的時間)
-
Linux系統(tǒng)
+關(guān)注
關(guān)注
4文章
590瀏覽量
27318 -
RTC
+關(guān)注
關(guān)注
2文章
523瀏覽量
66228 -
STM32L4
+關(guān)注
關(guān)注
1文章
42瀏覽量
9374
發(fā)布評論請先 登錄
相關(guān)推薦
評論