在電腦的硬體中包含一個系統時鐘,系統引導的時候讀取該時鐘,然後維持它自己的時鐘計數器,利用時鐘計數器對系統內的事件,如檔的創建或使用者登錄等給出時間記錄。 時鐘值也可以利用time()系統調用供你自己的程式使用:
#include <sys/types/h>
#include (time.h>
time_t time(time_t *loc);
這個系統調用返回一個time_t值,如果參數loc是指向這種類型的變數的指標,則傳回值也被拷貝到這個指標所指的變數中。
資料類型time_t實際上由typedef定義,可以通過<time.h>訪問,它的基本HTTP://www.aliyun.com/zixun/aggregation/18278.html"> 資料類型是long。 因此time()系統調用返回一個長型整數作為當前時鐘的時間值,但是,這是一種奇怪格式,即從格林威治時間1970年1月1日午夜起所經過的秒數(我假定這個時鐘必定在某一時刻開始...)。
有一個枝節問題是:它用一個長型整數可以記錄多長時間? 如果限制在32位長的正整數範圍內(負值對時間沒有任何意義! ),則它剛好超過68年,或者說直到2038年初(還有充裕的時間想一個替代辦法)。
這種時間格式實際上相當有用,如果你想要解決兩個事件之間(例如你的登錄時間和退出系統的時間)經過了多長時間,你只要從較早時間減去較晚時間就得到兩個事件之間的秒數。
但是,在你想要顯示日,月年或者當天的時間的情況下,這種時間格式就不太方便。 為了簡化這些操作,標準庫中包含一些有用的函數為你進行轉換。 兩個這樣的函數是:
#include <time.h>
struct tm *gmtime(time_t *loc);
struct tm *localtime(time_t *loc);
這兩個函數都取一個參數loc,它是指向包含‘自1970年以來的秒數’值的變數的指標。 這裡兩個函數都返回指向一個結構的指標,該結構的域包含有要求的資訊:
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_lsdst;
}
域tm_hour,tm_min,和tm_sec以24小時的時鐘格式給出時鐘時間,tm_mday是在1到31範圍內的該月的日子,tm_mon是範圍為0-11月數,一月(January)作為0,tm_ year是自1900以來的年數,tm_wday是範圍為0到6的一周的日子,星期天(Sunday)為0,tm_yday是範圍為0到365該年的日子,一月一日(1 January)作為0,tm_ isdst是一個標誌規定夏時制是否有效(如果該資訊可供使用)。
這兩個函數的主要差別是gmtime()給出的它的相對於格林威治時間(GMT)的時間資訊,而localtime()給出的它的相對你的本地時區的時間資訊(在系統安裝和配置期間設置本地時區)。