時間結構類型

Unix/Linux下有以下幾種時間結構:

1、time_t 類型:長整型,一般用來表示從1970-01-01 00:00:00時以來的秒數,精確度:秒;由函數time()獲取;

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

     #define _TIME_T
       typedef   long   time_t;         /* time of day in seconds */
     #endif  /* _TIME_T */

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

     如:time_t   time = time(NULL);

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

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

     struct timeb

      {
        time_t  time;                     /* time, seconds since the epoch      :秒*/
        unsigned short millitm;     /* 1000 msec of additional accuracy :毫秒 */
        short   timezone;              /* timezone, minutes west of GMT     :時區 */
        short   dstflag;                 /* daylight savings when appropriate :時區標記 */
      };

      #include <sys/timeb.h>

      int  ftime(struct  timeb*  tp);

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

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

      由函數gettime0fday()獲取;

      struct  timeval結構定義爲:

      struct  timeval

      {

          long  tv_sec;     /*  Seconds:  秒*/

          long  tv_usec;   /*  MicroSeconds:微秒*/

      }

      讀取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;  /* 和Greenwich 時間差了多少分鐘 */ 
         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 /*澳洲(1986年以後)*/ 

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

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

      struct  timespec                /* definition per POSIX.4 */

      {

          time_t    tv_sec;            /* Seconds         :秒 */

          long       tv_nsec;          /*  Nanoseconds :納秒 */

     };

     typedef   struct  timespec   timespec_t;

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

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

5、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; /* relative time in a specified resolution */
     #endif  /* ifndef _CLOCK_T */

6、struct  tm 結構:由函數gmtime()解析time_t得到

      struct tm*gmtime(const time_t*timep); 
      函數說明:gmtime()將參數timep 所指的time_t 結構中的信息轉換成真實世界所使用的時間日期表示方法,然後

      將結果由結構tm返回。 
      結構tm的定義爲 
      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; 
      }; 
      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 從今年1月1日算起至今的天數,範圍爲0-365 
      int   tm_isdst 日光節約時間的旗標 
      此函數返回的時間日期未經時區轉換,而是UTC時間。 
      返回值:返回結構tm代表目前UTC 時間 

7、Unix對時間單位的定義

     #define SEC                1                        // 秒
     #define MILLISEC        1000                  // 毫秒
     #define MICROSEC     1000000            // 微秒
     #define NANOSEC       1000000000      // 納秒

8、時間格式化函數:

     size_t strftime(char *str,size_t max,char *fmt,struct tm *tp);  strftime有點像sprintf,其格式由fmt來指定。  
     %a : 本第幾天名稱,縮寫
     %A : 本第幾天名稱,全稱
     %b : 月份名稱,縮寫
     %B : 月份名稱,全稱
     %c : 與ctime/asctime格式相同
     %d : 本月第幾日名稱,由零算起
     %H : 當天第幾個小時,24小時制,由零算起
     %I : 當天第幾個小時,12小時制,由零算起
     %j : 當年第幾天,由零算起
     %m : 當年第幾月,由零算起
     %M : 該小時的第幾分,由零算起
     %p : AM或PM
     %S : 該分鐘的第幾秒,由零算起
     %U : 當年第幾,由第一個日開始計算
     %W : 當年第幾,由第一個一開始計算
     %w : 當第幾日,由零算起
     %x : 當地日期
     %X : 當地時間
     %y : 兩位數的年份
     %Y : 四位數的年份
     %Z : 時區名稱的縮寫
     %% : %符號


     char * strptime(char *s,char *fmt,struct tm *tp);  如同scanf一樣,解譯字串成爲tm格式
     %h : 與%b及%B同
     %c : 讀取%x及%X格式
     %C : 讀取%C格式
     %e : 與%d同
     %D : 讀取%m/%d/%y格式
     %k : 與%H同
     %l : 與%I同
     %r : 讀取"%I:%M:%S %p"格式
     %R : 讀取"%H:%M"格式
     %T : 讀取"%H:%M:%S"格式
     %y : 讀取兩位數年份
     %Y : 讀取四位數年

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