C程序中對時間的處理——time庫函數詳解以及系統時間結構體類型

包含文件:<sys/time.h> <time.h>
一、在C語言中有time_t, tm, timeval等幾種類型的時間
1、time_t
    長整型,一般用來表示從1970-01-0100:00:00時以來的秒數,精確度:秒;由函數time()獲取;

    該類型定義在頭文件/usr/include/sys/time.h 中:

    #define _TIME_T
      typedef  long  time_t;        
    #endif 

     函數定義:time_t  time(time_t*  lpt);

    如:time_t   time = time(NULL);


2、timeval
     它有兩個成員;一個是秒,另一個表示微秒,精確度:微秒(10E-6)

     由函數gettime0fday()獲取;

      struct timeval結構定義爲:

     struct  timeval

     {

         long tv_sec;    

         long tv_usec;  

     }

     讀取struct timeval結構數據的函數說明:

     #include <sys/time.h>
     int  gettimeofday(struct timeval*  tv,struct timezone*  tz);

     該函數會提取系統當前時間,並把時間分爲秒和微秒兩部分填充到結構struct timeval中;同時把當地的時區信

     息填充到結構struct  timezone中;

      返回值:成功則返回0,失敗返回-1,錯誤代碼存於errno。附加說明EFAULT指針tv和tz所指的內存空間超出存

     取權限。

     struct  timezone結構的定義爲:

     struct  timezone

     {

        int  tz_minuteswest; 
        int  tz_dsttime;         

     }

 

    上述兩個結構都定義在/usr/include/sys/time.h。tz_dsttime 所代表的狀態如下
     DST_NONE
     DST_USA
     DST_AUST
     DST_WET
     DST_MET  
      DST_EET
     DST_CAN
     DST_GB
     DST_RUM
     DST_TUR
     DST_AUSTALT

 
3、tm
tm是一個結構體,定義爲:
struct tm
{
    int tm_sec;      /*代表目前秒數,正常範圍爲0-59,但允許至61秒 */
    int tm_min;     /*代表目前分數,範圍0-59*/
    int tm_hour;   /* 從午夜算起的時數,範圍爲0-23 */
    int tm_mday;  /* 目前月份的日數,範圍01-31 */
    int tm_mon;   /*代表目前月份,從一月算起,範圍從0-11 */
    int tm_year;   /*從1900 年算起至今的年數*/
    int tm_wday;   /* 一星期的日數,從星期一算起,範圍爲0-6。*/
    int tm_yday;   /* Days in year.[0-365] */
    int tm_isdst;   /*日光節約時間的旗標DST. [-1/0/1]*/
};


4、struct timeb結構:它有兩個主要成員,一個是秒,另一個是毫秒;精確度:毫秒(10E-3秒)

     由函數ftime()獲取structtimeb結構的時間;其定義如下:

     structtimeb

     {
       time_t time;                    
       unsigned shortmillitm;    
       short  timezone;             
       short  dstflag;                
     };

     #include <sys/timeb.h>

     int  ftime(struct timeb*  tp);

     調用成功返回0;調用失敗返回-1;


5、struct  timespec結構:它是POSIX.4標準定義的一個時間結構,精確度:納秒(10E-9秒)

     由函數gethrestime()或gethrestime_lasttick()獲取當前系統struct timespec結構的時間;其定義如下:

     struct timespec              

     {

         time_t   tv_sec;           

         long      tv_nsec;         

     };

    typedef  struct timespec   timespec_t;

    該結構定義在頭頭文件 /usr/include/sys/time_impl.h 中;

    extern  void   gethrestime(timespec_t*);
    extern   void  gethrestime_lasttick(timespec_t*);


6、clock_t 類型:由函數clock()獲取;

    #include <time.h>

     clock_t   clock(void);

    該函數以微秒的方式返回CPU的時間;

    類型 clock_t 定義在頭文件/usr/include/sys/types.h中:

    #ifndef _CLOCK_T
    #define _CLOCK_T
     typedef   long  clock_t;
    #endif 


7、Unix對時間單位的定義

    #defineSEC                1                       // 秒
    #defineMILLISEC       1000                 // 毫秒
    #defineMICROSEC     1000000           // 微秒
    #defineNANOSEC       1000000000     // 納秒




二、具體操作函數

time()函數
  原 型:time_t time(time_t * timer)
  功 能: 獲取當前的系統時間,返回的結果是一個time_t類型,其實就是一個大整數,其值表示從CUT(Coordinated Universal Time)時間1970年1月1日00:00:00(稱爲UNIX系統的Epoch時間)到當前時刻的秒數。然後調用localtime將time_t所表示的CUT時間轉換爲本地時間(我們是+8區,比CUT多8個小時)並轉成struct tm類型,該類型的各數據成員分別表示年月日時分秒。
 程序例1:
  time函數獲得日曆時間。日曆時間,是用“從一個標準時間點到此時的時間經過的秒數”來表示的時間。這個標準時間點對不同的編譯器來說會有所不同,但對一個編譯系統來說,這個標準時間點是不變的,該編譯系統中的時間對應的日曆時間都通過該標準時間點來衡量,所以可以說日曆時間是“相對時間”,但是無論你在哪一個時區,在同一時刻對同一個標準時間點來說,日曆時間都是一樣的。
  #include <time.h>
  #include <stdio.h>
  #include <dos.h>
  int main(void)
  {
  time_t t; t = time(NULL);
  printf("The number of seconds since January 1, 1970 is %ld",t);
  return 0;
  }
 程序例2:
  //time函數也常用於隨機數的生成,用日曆時間作爲種子。
  #include <stdio.h>
  #include <time.h>
  #include<stdlib.h>
  int main(void)
  {
  int i;
  srand((unsigned) time(NULL));
  printf("ten random numbers from 0 to 99\n\n");
  for(i=0;i<10;i++)
   printf("%d\n",rand()%100);
  return 0;
  }
 程序例3:
  用time()函數結合其他函數(如:localtime、gmtimeasctimectime)可以獲得當前系統時間或是標準時間。
  #include <stdio.h>
  #include <stddef.h>
  #include <time.h>
  int main(void)
  {
  time_t timer;//time_t就是long int 類型
  struct tm *tblock;
  timer = time(NULL);//這一句也可以改成time(&timer);
  tblock = localtime(&timer);
  printf("Local time is: %s\n",asctime(tblock));
  return 0;
  }
 
gmtime()函數
  原 型:struct tm *gmtime(long *clock);
  功 能:把日期和時間轉換爲格林威治(GMT)時間的函數。將參數timep 所指的time_t 結構中的信息轉換成真實世界所使用的時間日期表示方法,然後將結果由結構tm返回
        說 明:此函數返回的時間日期未經時區轉換,而是UTC時間。
        返回值:返回結構tm代表目前UTC 時間

        程序例

      #include "stdio.h"
  #include "time.h"
  #include "stdlib.h"
  int main(void)
  {
  time_t t;
  struct tm *gmt, *area;
  tzset(); /* tzset()設置時區*/
  t = time(NULL);
  area = localtime(&t);
  printf("Local time is: %s", asctime(area));
  gmt = gmtime(&t);
  printf("GMT is: %s", asctime(gmt));
  return 0;
  }

localtime()函數
  功 能: 把從1970-1-1零點零分到當前時間系統所偏移的秒數時間轉換爲日曆時間 。
  說 明:此函數獲得的tm結構體的時間,是已經進行過時區轉化爲本地時間。
  用 法: struct tm *localtime(const time_t *clock);
  返回值:返回指向tm 結構體的指針.tm結構體是time.h中定義的用於分別存儲時間的各個量(年月日等)
的結構體.
 
程序例1:
  #include <stdio.h>
  #include <stddef.h>
  #include <time.h>
  int main(void)
  {
  time_t timer;//time_t就是long int 類型
  struct tm *tblock;
  timer = time(NULL);
  tblock = localtime(&timer);
  printf("Local time is: %s\n",asctime(tblock));
  return 0;
  }
  執行結果:
  Local time is: Mon Feb 16 11:29:26 2009
程序例2:
  上面的例子用了asctime函數,下面這個例子不使用這個函數一樣能獲取系統當前時間。
        需要注意的是年份加上1900,月份加上1
  #include<time.h>
  #include<stdio.h>
  int main()
  {
  struct tm *t;
  time_t tt;
  time(&tt);
  t=localtime(&tt);
  printf("%4d年%02d月%02d日 %02d:%02d:%02d\n",
               t->tm_year+1900,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
  return 0;
  }
 
localtime()和gmtime()的區別:
  gmtime()函數功能類似獲取當前系統時間,只是獲取的時間未經過時區轉換。
  localtime函數獲得的tm結構體的時間,是已經進行過時區轉化爲本地時間。
 
localtime_r()和gmtime_r()函數
  struct tm *gmtime_r(const time_t *timep, struct tm *result); 
  struct tm *localtime_r(const time_t *timep, struct tm *result);
  gmtime_r()函數功能與此相同,但是它可以將數據存儲到用戶提供的結構體中。
  localtime_r()函數功能與此相同,但是它可以將數據存儲到用戶提供的結構體中。它不需要設置tzname。
  使用gmtime和localtime後要立即處理結果,否則返回的指針指向的內容可能會被覆蓋。
       一個好的方法是使用gmtime_r和localtime_r,由於使用了用戶分配的內存,這兩個函數是不會出錯的。
 
asctime()函數
  功 能: 轉換日期和時間爲相應的字符串(英文簡寫形式,形如:Mon Feb 16 11:29:26 2009)
  用 法: char *asctime(const struct tm *tblock);
 
ctime()函數
  功 能: 把日期和時間轉換爲字符串。(英文簡寫形式,形如:Mon Feb 16 11:29:26 2009)
  用 法: char *ctime(const time_t *time);
  說 明:ctime同asctime的區別在於,ctime是通過日曆時間來生成時間字符串,
                  而asctime是通過tm結構來生成時間字符串。
 
mktime()函數
  功 能:將tm時間結構數據轉換成經過的秒數(日曆時間)。
  原 型:time_t mktime(strcut tm * timeptr);。
  說 明:mktime()用來將參數timeptr所指的tm結構數據轉換成
                   從公元1970年1月1日0時0分0 秒算起至今的UTC時間所經過的秒數。
  返回值:返回經過的秒數。
 
difftime()函數
  功 能:計算時間間隔才長度,以秒爲單位,且只能精確到秒。
  原 型:double difftime(time_t time1, time_t time0);
  說 明:雖然該函數返回值是double類型的,但這並不說明該時間間隔具有同double一樣的精度,
                   這是由它的參數決定的。
 
strftime()函數
  功 能:將時間格式化,或者說:格式化一個時間字符串。我們可以使用strftime()函數將時間格式化爲我們想要的格式。
  原 型:size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr);
  參 數:我們可以根據format指向字符串中格式命令把timeptr中保存的時間信息放在strDest指向的字符串中,
                   最多向strDest中存放maxsize個字符。
  返回值:該函數返回向strDest指向的字符串中放置的字符數。
  類似於sprintf():識別以百分號(%)開始的格式命令集合,格式化輸出結果放在一個字符串中。
                    格式化命令說明串strDest中各種日期和時間信息的確切表示方法。格式串中的其他字符原樣放進串中。
                    格式命令列在下面,它們是區分大小寫的。
  %a 星期幾的簡寫
  %A 星期幾的全稱
  %b 月份的簡寫
  %B 月份的全稱
  %c 標準的日期的時間串
  %C 年份的後兩位數字
  %d 十進制表示的每月的第幾天
  %D 月/天/年
  %e 在兩字符域中,十進制表示的每月的第幾天
  %F 年-月-日
  %g 年份的後兩位數字,使用基於周的年
  %G 年份,使用基於周的年
  %h 簡寫的月份名
  %H 24小時制的小時
  %I 12小時制的小時
  %j 十進制表示的每年的第幾天
  %m 十進制表示的月份
  %M 十時製表示的分鐘數
  %n 新行符
  %p 本地的AM或PM的等價顯示
  %r 12小時的時間
  %R 顯示小時和分鐘:hh:mm
  %S 十進制的秒數
  %t 水平製表符
  %T 顯示時分秒:hh:mm:ss
  %u 每週的第幾天,星期一爲第一天 (值從0到6,星期一爲0)
  %U 第年的第幾周,把星期日作爲第一天(值從0到53)
  %V 每年的第幾周,使用基於周的年
  %w 十進制表示的星期幾(值從0到6,星期天爲0)
  %W 每年的第幾周,把星期一做爲第一天(值從0到53)
  %x 標準的日期串
  %X 標準的時間串
  %y 不帶世紀的十進制年份(值從0到99)
  %Y 帶世紀部分的十制年份
  %z,%Z 時區名稱,如果不能得到時區名稱則返回空字符。
  %% 百分號
  提示:與 gmstrftime() 的行爲相同,不同的是返回時間是本地時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章