Unix時間相關的函數

涉及到的數據結構

  • time_t,該對象中存放的是距離 1970-01-01 00:00:00 +0000 (UTC) 所通過的秒數.數據結構

  • struct tm,該對象中存放的是具體的日期值,包括年,月,日,時,分,秒,等等.以下:函數

struct tm {
    int tm_sec; /* 秒數,[0,60],取 60 的緣由是可能存在潤秒的緣故 */
    int tm_min; /* 分鐘,[0,59] */
    int tm_hour;/* 小時,[0,23] */
    int tm_mday;/* 日期數,[1,31] */
    int tm_mon;/* 距離一月的月數,[0,11],即當爲0時,代表是 1 月. */ 
    int tm_year;/* 距離 1900 所通過的年數,即當前實際年份爲 tm_year+1900 */
    int tm_wday;/* 距離週日的天數,[0,6],即當爲0時,代表是週日 */
    int tm_yday;/* 距離 1 月 1 號的天數,[0,365] */
    int tm_isdst;/* 是不是夏令時,若<0,代表該域信息不可用,若=0,代表沒有采用夏令時,若>0,代表採用了夏令時 */
};

函數之間的關係

  • time(),從內核中取出當前時間,能夠使用 gettimeofday() 獲取更精確的時間.(參考 man 手冊)
    spa

  • gmtime(),localtime(),將 time_t 類型的對象格式化爲 struct tm 類型.(參考 man 手冊)
    code

  • mktime().將 struct tm 類型的對象格式化爲 time_t 類型,該函數具體見下:對象

/**
 * 將 struct tm 類型格式化爲 time_t 類型.
 * tm 做爲輸入/輸出參數:
 * 在輸入時,將忽略 tm_wday,tm_yday 域,而且若 tm_isdst<0,此時 mktime() 內部本身判斷是否使用了夏令時,若 tm_isdst >0,代表採用了夏令時,不然未採用夏令時.
 * 在輸出時,若 tm_sec,tm_min,...,tm_year 的值超出範圍,則會規範化,如 10月40號會被規範爲 11月9號;tm_wday,tm_yday 會從新計算.tm_isdst 會從新設置代表是否使用了夏令時.
 * 若 tm 包括的信息沒法轉化爲 time_t 類型,則 tm 各域的值保持不變,而且返回 -1.
 */
time_t mktime(struct tm *tm);
相關文章
相關標籤/搜索