之前在網上看到的一篇文章,由于連結已失效,在這裡貼一下。
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
}