天天看點

C/C++下擷取系統時間的函數

之前在網上看到的一篇文章,由于連結已失效,在這裡貼一下。

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所指的記憶體空間超出存取權限。
4、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年以後)*/
5、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*);
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; /* relative time in a specified resolution */
    #endif  /* ifndef _CLOCK_T */
7、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 時間
8、Unix對時間機關的定義:
     #define SEC                1          // 秒
     #define MILLISEC        1000          // 毫秒
     #define MICROSEC     1000000          // 微秒
     #define NANOSEC       1000000000      // 納秒
9、時間格式化函數:
     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 : 讀取四位數年份
           

Windows下各種API也很多。下面是自己整的一個精确到毫秒的時間函數:

#include <time.h>

#if defined _AIX_  
#include <sys/times.h>   
#include <sys/timeb.h>   
#endif

void get_cur_time(char *cur_time)   
{  
#if defined _AIX_   
    struct timeb tp;  
    struct tm *tm;  
      
    ftime(&tp);  
    tm = localtime(&tp.time);  
      
    sprintf(cur_time, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d",   
                        1900+ tm->tm_year,   
                        1 + tm->tm_mon,   
                        tm->tm_mday,   
                        tm->tm_hour,   
                        tm->tm_min,   
                        tm->tm_sec,   
                        tp.millitm);  
#elif defined WIN32   
    SYSTEMTIME st;   
  
    GetLocalTime(&st);   
    sprintf(cur_time, "%.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d",  
                        st.wYear,     
                        st.wMonth,  
                        st.wDay,     
                        st.wHour,    
                        st.wMinute,    
                        st.wSecond,    
                        st.wMilliseconds);   
#endif   
}