Linux系统时间函数
先來說說自己在做工程過程中的一些理解:
1, 輸入time_t,輸出tm格式的函數?loctaltime(time_t) / gmtime(time_t)
其中localtime會受時區和夏令時影響,也就是說系統會把函數輸入的time_t格式的值作為UTC時間,然后根據本地的TZ環境變量,進行小時的偏移得到一個tm格式的時間;
gmtime則不做環境變量相關的處理,直接獲得tm格式的值。?
2, 輸入tm,輸出time_t格式的函數mktime()
這個函數也受TZ環境變量的影響,確切來說受夏令時標志的影響。如果tm中tm_isdst成員為1,則在做轉化時,mk會自動獲得程序運行環境的夏令時信息,所以結果受tm成員與夏令時偏移量共同影響。
3,?字符串格式函數ctime(time_t)??asctime(tm)
將對應的值根據本地時間環境變量打印。
以下摘自于網友的好帖子
?
系統函數的轉化關系如下:
?
?time_t與struct?tm之間的轉換
struct?tm?{
????int?tm_sec;??????/*Seconds?(0-60)*/
????int?tm_min;?????/*Minites?(0-59)*/
????int?tm_hour;???/*Hours?(0-23)*/
????int?tm_mday;??/*Day?of?the?month?(1-31)*/
????int?tm_mon;???/*Month?(1-12)*/
????int?tm_year;????/*Year?since?1900*/
????int?tm_wday;???/*Day?of?the?week?(Sunday?=?0)*/
????int?tm_yday;????/*Day?in?the?year?(0-365;?1?Jan?=?0)*/
????int?tm_isdst;????/*Daylight?saving?time?flag?>?0:?DST?is?in?effect;?=?0:?DST?is?not?effect;?<?0:?DST?information?not?available*/
};
結構體tm將日期和時間分解成多個獨立的字段,這樣能方便程序獲取不同的字段值來處理。字段tm_sec的上限為60而不是59,這樣的設計主要是考慮閏秒,偶爾用其將人類日歷調整至精確的天文年(所謂的回歸年)。如果程序中定義了_BSD_SOURCE測試宏,那么有glibc定義的tm結構還會包括兩個字段,一個為long?int?tm_gmtoff,用于表示時間超出UTC以東的秒數,一個為const?char*?tm_zone,用于表示時區的縮寫(例如:CEST為歐洲中部夏令時間)。
?
gmtime()和localtime()兩個函數可將time_t轉換成struct?tm。gmtime()直接將time_t分解成UTC時間的tm,localtime()需要考慮時區和夏令時的設置,具體聲明如下:
#include?<time.h>?
//?Both?return?a?pointer?to?a?statically?allocated?broker-down?time?structure?on?success,?or?NULL?on?error
struct?tm*?gmtime?(const?time_t?*timep);
struct?tm*?localtime?(const?time_t?*timep);
以上兩個函數都是非線程安全的,線程安全版本為gmtime_r()和localtime_r()
?
mktime()函數可以將struct?tm轉換成time_t,其聲明如下:
time_t?mktime?(struct?tm?*timeptr);
該函數可能會修改timeptr對應的值,至少會確保對tm_wday和tm_yday字段的設置,確保這些字段與其他字段能夠相互對應起來。同時,mktime()在進行轉換時會對時區進行設置。此外,DST設置的使用與否取決于輸入字段tm_isdst的值。
- 若tm_isdst為0,則將這一時間視為標準時間(即,忽略夏令時)
- 若tm_isdst大于0,則將這一時間視為夏令時
- 若tm_isdst小于0,則試圖判定DST在每年的這一時間是否生效。這往往是眾望所歸的設置
? ?定義于/usr/share/zoneinfo中。時區的設置會影響到ctime()、localtime()、mktime()、strftime()等函數,為了獲取時區設置,這些函數都會調用tzset(3)對如下全局變量進行設置:
char?*tzname[2];?????/*Name?of?timezone?and?alternate?(DST)?timezone*/
int?daylight;????????????/*Nonzero?if?there?is?an?alternate?(DST)?timezone*/
long?timezone;???????/*Seconds?difference?between?UTC?and?local?standard?time*/
總結
以上是生活随笔為你收集整理的Linux系统时间函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux mktime 源代码简析
- 下一篇: linux几种时间函数总结