常用時間函數
初寫:2003.05.18, 更新日期:2012.12.10
 
撰寫:曾老師
 
  • 時間函數標頭檔 time.h:
    time.h 是C語言處理時間的標準化函式庫檔,
    裡面有時間日期的取得、處理、解析、格式化等的函數。


  • 時間time.h內,常用函數表 [for ANSI]:
    函數名稱 功能 呼叫格式
     asctime( ) 將時間轉成英文字串 char asctime(struct tm *time_ptr)
     clock( ) 測試程式使用的時間. clock_t clock( void )
     ctime( ) 將clock_t結構轉成
    字串時間.
    char *ctime( time_t *time_ptr )
     difftime( ) 計算兩長整數時間的差
    (sec)
    double difftime(time_t t2,time_t t1)
     gmtime( ) 將tm結構轉成時區時間 struct tm *gmtime(time_t *time_ptr)
     localtime( ) 取時間資訊
    轉成當地區時間
    struct tm *localtime(time_t *time_ptr)
     time( ) 傳回秒數 time_t time(time_t *time_ptr)


    time.h 函式庫檔中定義一個struct結構,項目如下:
    struct tm
    {
       int tm_sec   /* 秒 [0,59] */
       int tm_min   /* 分 [0,59] */
       int tm_hour  /* 小時 [0,23] */
       int tm_mday  /* 一個月中第幾天 [1,31] */
       int tm_mon   /* 一年中第幾月 [0,11],0:一月 */
       int tm_year  /* 年份,從1900年起的數值 */
       int tm_wday  /* 一週中第幾天 [0,6] (Sunday=0) */
       int tm_yday  /* 一年中第幾天 [0,365] */
       int tm_isdst /* 夏令旗標 daylight savings flag*/
    }


    檔案中也定義以下名稱:
    NULL: 空指標。
    CLK_TCK: 每秒由times()傳回的時脈震盪數。
    CLOCKS_PER_SEC: 一個用來轉換從clock()的傳回值成秒數的數,一般在標頭檔中被定義為長整數1000。


  • time( )
    • 功能:傳回從格林威治時間1970年1月1日,00:00:00到現在的秒數.
    • 載入檔:time.h
    • 呼叫:time_t time(time_t *timer)
         *timer: 存放函數結果的時間指標.
    • 傳回值:整數秒數
    • 範例:
      #include <stdio.h>
      #include <time.h>
      main(void)
      {
           int x;
           time_t now;
           x=time(&now);
           printf("time(now)=%d\n",x);
      }


  • asctime()
    • 功能:將結構tm結構中的時間資料, 轉換成時間字串.
      tm 結構如下:
      int tm_sec; //seconds [0,61]
      int tm_min; // minutes [0,59]
      int tm_hour; // hour [0,23]
      int tm_mday; // day of month [1,31]
      nt tm_mon; // month of year [0,11]
      int tm_year; // years since 1900
      int tm_wday; // day of week [0,6] (Sunday = 0)
      int tm_yday; // day of year [0,365]
      int tm_isdst; // daylight savings flag
    • 載入檔:time.h
    • 呼叫:char asctime( struct tm *time_ptr );
    • 傳回值:時間字串
    • 範例:
      #include <stdio.h>
      #include <time.h>
      main(void)
      {
         struct tm *y;
         y=localtime(&now);
         printf("asctime(now)=%s\n", asctime(y));
      }


  • clock()
    • 功能:抓取CPU時間的函式.
    • 載入檔:time.h
    • 呼叫:clock_t clock(void);
    • 說明:
      程式執行的時間,並不像一般牆上的鐘錶時間,
      因為程式執行時間,並不包括等待輸出入函式接受系統的時間。
      為了抓取實際使用CPU的時間(cpu elapsed time),
      使用clock()函式抓取以資料型態 clock_t 所定義的 long int 結構,
      可以在呼叫時,得到一個時序震盪(clock tick)的數字。
      只要將兩次呼叫的數字相減,
      再除以每秒的震盪數CLK_TCK 或 CLOCKS_PER_SEC,
      可精準估算出此程式使用的時間。

    • 範例:
      #include <time.h>
      clock_t start_tick, end_tick;
      double elapsed;
      start_tick = clock();
         /* 欲計算的工作流程. */
      end_tick = clock();
      elapsed = (double) (end_tick - start_tick) / CLOCKS_PER_SEC;
      如果要更詳細計算程式或程序執行時間,
      則需使用clock_t裡的 tms 結構,部分名稱如下:
      clock_t tms_utime   執行程式/程序在執行指令所用到的 CPU 時間.
      clock_t tms_stime   系統在呼叫程序/程式所使用的CPU時間。
      clock_t tms_cutime   是tms_utime和tms_cutime兩個值的和,
        在完成一個完整程式或程序所需的總時間,包括等待子程序時間、執行指令時間等。

        這些時間函數呼叫時皆為正數,且首次process或程式的呼叫值皆為0。


  • ctime() 
    • 功能:效果跟 asctime(localtime(clock))類似
    • 載入檔:time.h
    • 呼叫:char *ctime(time_t  *time_ptr);
    • 傳回值:double
    • 範例:
      #include <stdio.h>
      #include <time.h>
      main()
      {
          time_t now;
          printf("ctime(now)=%s\n", ctime(&now));
      }


  • difftime
    • 功能:
    • 載入檔:time.h
    • 呼叫:double difftime(time_t time_2, time_t time_1);
    • 傳回值:double

參考資料: