天天看點

C語言時間操作time_t别名time庫函數tm結構體localtime庫函數mktime庫函數程式睡眠精确到微秒的計時器應用經驗版權聲明

       在實際開發中,對日期和時間的操作需求非常多,例如程式啟動和退出的時間,程式執行任務的時間,資料生成的時間,資料處理的各環節的時間等,無處不在。

       在學習時間之前,請把作業系統的時區設定為中國北京或上海時間。

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)

C語言時間操作time_t别名time庫函數tm結構體localtime庫函數mktime庫函數程式睡眠精确到微秒的計時器應用經驗版權聲明

       輸出結果

C語言時間操作time_t别名time庫函數tm結構體localtime庫函數mktime庫函數程式睡眠精确到微秒的計時器應用經驗版權聲明

mktime庫函數

       mktime函數的功能與localtime函數相反。

       localtime函數用于把time_t表示的時間轉換為struct tm表示的時間。

       mktime  函數用于把struct tm表示的時間轉換為time_t表示的時間。

       函數傳回time_t的值。

              time_t mktime(struct tm *tm);

       示例(book130.c)

C語言時間操作time_t别名time庫函數tm結構體localtime庫函數mktime庫函數程式睡眠精确到微秒的計時器應用經驗版權聲明

       運作結果

C語言時間操作time_t别名time庫函數tm結構體localtime庫函數mktime庫函數程式睡眠精确到微秒的計時器應用經驗版權聲明

程式睡眠

       在實際開發中,我們經常需要把程式挂起一段時間,可以使用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)

C語言時間操作time_t别名time庫函數tm結構體localtime庫函數mktime庫函數程式睡眠精确到微秒的計時器應用經驗版權聲明

       運作結果

C語言時間操作time_t别名time庫函數tm結構體localtime庫函數mktime庫函數程式睡眠精确到微秒的計時器應用經驗版權聲明

       各位,book132.c程式采用usleep睡眠十分之一秒,但是計時器顯示的實際時間大于十分之一秒,為何?原因很簡單,因為程式執行需要時間,雖然這個時間很短,在千分之一秒内,那也是需要時間。

       還有一個要注意的問題,time.h 是ISO C99 标準日期時間頭檔案。sys/time.h 是Linux 系統的日期時間頭檔案,也就是說,timeval、timezone結構體和gettimeofday函數在windows平台中不能使用。

應用經驗

       在實際開發中,除了目前的時間,還經常需要一個偏移量的時間,例如擷取十分鐘之後的時間,做法是采用time函數得到一個整數後,再加上10*60秒,再用localtime函數轉換為結構體。

版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的連結。

來源:C語言技術網(www.freecplus.net)

作者:碼農有道

如果這篇文章對您有幫助,請點贊支援,或在您的部落格中轉發我的文章,謝謝!!!

如果文章有錯别字,或者内容有誤,或其他的建議或意見,請您留言指正,非常感謝!!!

繼續閱讀