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*/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM