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 : 讀取四位數年