在實際開發中,對日期和時間的操作需求非常多,例如程式啟動和退出的時間,程式執行任務的時間,資料生成的時間,資料處理的各環節的時間等,無處不在。
在學習時間之前,請把作業系統的時區設定為中國北京或上海時間。
time_t别名
在C語言中,用time_t來表示時間資料類型,它是一個long(長整數)類型的别名,在time.h檔案中定義,表示一個月曆時間,是從1970年1月1日0時0分0秒到現在的秒數。
typedef long time_t;
可以看出time_t其實是一個長整型。
time庫函數
time函數的用途是傳回一個值,也就是從1970年1月1日0時0分0秒到現在的秒數。
time函數是C語言标準庫中的函數,在time.h檔案中聲明。
time_t time(time_t *t);
time函數有兩種調用方法:
time_t tnow;
tnow =time(0); // 将空位址傳遞給time函數,并将time傳回值賦給變量tnow
或
time(&tnow); // 将變量tnow的位址作為參數傳遞給time函數
各位可以寫代碼測試一下這兩種方式,效果完全相同。
tm結構體
time_t隻是一個長整型,不符合我們的使用習慣,需要轉換成可以友善表示時間的結構體,即tm結構體,tm結構體在time.h中聲明,如下:
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_isdst;
};
這個結構定義了年、月、日、時、分、秒、星期、當年中的某一天、夏令時。用這個結構體可以很友善的顯示時間。
localtime庫函數
localtime函數用于把time_t表示的時間轉換為struct tm表示的時間,函數傳回struct tm結構體的位址。
函數聲明:
struct tm * localtime(const time_t *);
struct tm結構體包含了時間的各要素,但還不是我們習慣的時間表達方式,我們可以用格式化輸出printf、sprintf或fprintf等函數,把struct tm結構體轉換為我們想要的結果。
示例(book128.c)
輸出結果
mktime庫函數
mktime函數的功能與localtime函數相反。
localtime函數用于把time_t表示的時間轉換為struct tm表示的時間。
mktime 函數用于把struct tm表示的時間轉換為time_t表示的時間。
函數傳回time_t的值。
time_t mktime(struct tm *tm);
示例(book130.c)
運作結果
程式睡眠
在實際開發中,我們經常需要把程式挂起一段時間,可以使用sleep和usleep兩個庫函數,需要包含unistd.h頭檔案中。函數的聲明如下:
unsigned int sleep(unsigned int seconds);
int usleep(useconds_t usec);
sleep函數的參數是秒,usleep函數的參數是微秒,1秒=1000000微秒。
sleep(1); // 程式睡眠1秒。
sleep(10); // 程式睡眠10秒。
usleep(100000); // 程式睡眠十分之一秒。
usleep(1000000); // 程式睡眠一秒。
程式員不關心sleep和usleep函數的傳回值。
精确到微秒的計時器
1、timeval結構體
timeval結構體在sys/time.h檔案中定義,聲明為:
struct timeval
{
long tv_sec; // 1970年1月1日到現在的秒。
long tv_usec; // 目前秒的微妙,即百萬分之一秒。
};
2、timezone 結構體
timezone 結構體在sys/time.h檔案中定義,聲明為:
struct timezone
{
int tz_minuteswest; // 和greenwich 時間差了多少分鐘。
int tz_dsttime; // type of DST correction。
}
3、gettimeofday庫函數
gettimeofday是獲得目前的秒和微秒的時間,其中的秒是指1970年1月1日到現在的秒,微秒是指目前秒已逝去的微秒數,可以用于程式的計時。調用gettimeofday函數需要包含sys/time.h頭檔案。
函數聲明:
int gettimeofday(struct timeval *tv, struct timezone *tz )
目前的時間存放在tv 結構體中,當地時區的資訊則放到tz所指的結構中。
函數執行成功後傳回0,失敗後傳回-1。
在使用gettimeofday()函數時,第二個參數一般都為空,我們一般都隻是為了獲得目前時間,不關心時區的資訊。
示例(book132.c)
運作結果
各位,book132.c程式采用usleep睡眠十分之一秒,但是計時器顯示的實際時間大于十分之一秒,為何?原因很簡單,因為程式執行需要時間,雖然這個時間很短,在千分之一秒内,那也是需要時間。
還有一個要注意的問題,time.h 是ISO C99 标準日期時間頭檔案。sys/time.h 是Linux 系統的日期時間頭檔案,也就是說,timeval、timezone結構體和gettimeofday函數在windows平台中不能使用。
應用經驗
在實際開發中,除了目前的時間,還經常需要一個偏移量的時間,例如擷取十分鐘之後的時間,做法是采用time函數得到一個整數後,再加上10*60秒,再用localtime函數轉換為結構體。
版權聲明
C語言技術網原創文章,轉載請說明文章的來源、作者和原文的連結。
來源:C語言技術網(www.freecplus.net)
作者:碼農有道
如果這篇文章對您有幫助,請點贊支援,或在您的部落格中轉發我的文章,謝謝!!!
如果文章有錯别字,或者内容有誤,或其他的建議或意見,請您留言指正,非常感謝!!!