先來說說自己在做工程過程中的一些理解:
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*/