Linux下關於時間概念的C語言程式設計

工程師WWW發表於2014-04-08

Abstract

  在程式中,經常需要輸出系統的當前時間、計算程式的執行時間、使用計時器等。

Introduction

一、時間的型別
1.格林威治標準時間
   coordinated universal time(UTC)是世界標準時間,即常說的格林威治標準時間(greenwich mean time,GMT).
2.日曆時間
   日曆時間(calendar time)是用"一個標準時間點(如1970年1月1日0點)到此時經過的秒數"來表示的時間.
   
二、時間函式的API

  時間函式的API均屬於系統呼叫函式.。

1.獲取日曆時間
   #include <time.h>
   time_t time(time_t *tloc)
   函式功能:獲取日曆時間,即從1970年1月1日0點到現在所經歷的秒數.
   引數:通常設定為NULL

 (time_t在time.h中定義:typedef long int time_t)
   例:
   #include <time.h>
   void main()
   {
      int seconds=0;
      seconds = time(NULL);
      printf("seconds=%d\n",seconds);
   }
   執行結果:
[root@localhost Time]# ./time
seconds=1294908511
   通常使用者得到日曆時間的秒數沒有實際的意義,但可以為時間轉化做一些鋪墊性質的工作.為了更好的利用時間,用

戶需要將這些秒數轉化為更容易接受的時間表示方式,這些表示時間的方式有格林威治時間、本地時間等.

2.將日曆時間轉換為格林威治標準時間
   struct tm *gmtime(const time_t *timep)
   函式功能:將日曆時間轉化為格林威治標準時間,並儲存在tm結構
   引數:日曆時間的返回值

3.將日曆時間轉化為本地時間
   struct tm* localtime(const time_t *timep)
   函式功能:將日曆時間轉化為本地時間,並儲存至tm結構
   引數:日曆時間的返回值
   由上面兩個函式可以看出,這兩個函式的返回值均存放在tm結構中,具體的tm結構如下:
   struct tm
   {
      int tm_sec;   //秒值
      int tm_min;   //分鐘值
      int tm_hour;  //小時值
      int tm_mday;  //本月第幾日
      int tm_mon;   //本年第幾月
      int tm_year;  //tm_year+1900=哪一年
      int tm_wday;  //本週第幾日
      int tm_yday;  //本年第幾日
      int tm_isdst; //日光節約時間
   }
   建立time1.c
   #include <stdio.h>
   #include <time.h>
   int main(void)
   {
  struct tm *local;
      time_t t;
      t = time(null);   //獲取日曆時間
      local = localtime(&t);  //將日曆時間轉化為本地時間,並儲存在struct tm結構中
      printf("local hour is :%d\n",local->tm_hour);
      local = gmtime(&t);  //將日曆時間轉化為格林威治時間,並儲存在struct tm結構中
      printf("utc hour is :%d\n",local->tm_hour);
      return 0;
   }
   執行結果:
[root@localhost Time]# gcc time1.c -o time1
[root@localhost Time]# ./time1
Local hour is: 0
UTC hour is: 8
[root@localhost Time]# date
Thu Jan 13 00:52:44 PST 2011
   利用函式gmtime()、localtime()可以將日曆時間轉化為格林威治時間和本地時間,雖然使用者可通過結構體tm來獲取

這些時間值,但看起來還不方便,最好是將所有的資訊,如年、月、日、星期、時、分、秒以字串的形式顯示出來,

這樣就加直觀.


4.時間顯示

   char *asctime(const struct tm *tm)
   函式功能:將tm格式的時間轉化為字串
   引數:日曆時間的返回值
   例如: SAT Jul 30 08:43:03 2005

該函式較ctime()使用起來更加的複雜.必須按照下面3個步驟來進行.
   <1>使用函式time()來獲取日曆時間
   <2>使用函式gmtime()將日曆時間轉化為格林威治標準時間
   <3>使用函式asctime()將tm格式的時間轉化為字串
   例程:
    #include <time.h>
    #include <stdio.h>
    int main(void)
   {
      struct tm *ptr;
      time_t lt;
      lt=time(null);  /*獲取日曆時間*/
      ptr=gmtime(&lt); /*轉化為格林威治時間*/
      printf(asctime(ptr)); /*以格林威治時間的字串方式列印*/
      printf(ctime(&lt)); /*以本地時間的字串方式列印*/
      return 0;
   }

   char *ctime(const time_t *timep)
   函式功能:將日曆時間轉化為本地時間的字串形式
   引數:日曆時間的返回值
   該函式較asctime()使用起來更加簡單.必須按照下面2個步驟來進行.
   <1>使用函式time()來獲取日曆時間
   <2>使用函式ctime()將日曆時間直接轉化為字串


  5.獲取從今日凌晨到現在的時間差
   int gettimeofday(struct timeval *tv,struct timezone *tz)
   函式功能:獲取從今日凌晨(0:0:0)到現在的時間差,常用於計算事件耗時
   引數1:存放從今日凌晨(0:0:0)到現在的時間差,時間差以秒或微秒為單位,以結構體形式存放
         struct timeval
        {
           int tv_sec;    //秒數
           int tv_usec;   //微秒數
        }
   引數2:常設定為null
   函式用法:可以在做某件事情之前呼叫gettimeofday(),在做完該件事情之後呼叫gettimeofday(),兩個函式的引數1

的差就是做該事情所消耗的時間.
   例程:計算函式function()的耗時
    time.c
    #include <sys/time.h> 
    #include <stdio.h>
    #include <stdlib.h> 
    #include <math.h>
    void function()   /* 演算法分析 */
   { 
      unsigned int i,j; 
      double y; 
      for(i=0;i<1000;i++) 
        for(j=0;j<1000;j++) 
         y++; 
   } 
   void main() 
  { 
      struct timeval tpstart,tpend; 
      float timeuse; 
      gettimeofday(&tpstart,null); // 開始時間
      function(); 
      gettimeofday(&tpend,null);   // 結束時間
  /* 計算執行時間,以微秒為單位進行計算 */
      timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; 
      timeuse/=1000000; 
      printf("used time:%f\n",timeuse); 
      exit(0); 
  } 
 執行結果:
 [root@localhost lishuai]# gcc time.c -o time -wall
 [root@localhost lishuai]# ./time
    use time:0.006288


6.延時函式
   <1>使程式睡眠seconds秒
      unsigned int sleep(unsigned int seconds)
   函式功能:使程式睡眠seconds秒
   引數:需要休眠的秒數
   <2>使程式睡眠usec微秒
      void usleep(unsigned long usec)
   函式功能:使程式睡眠usec微秒
   引數:需要休眠的秒數

相關文章