時(shí)間函數(shù)(13)
函數(shù)分類(lèi):
1. 設(shè)置時(shí)間: settimeofday, tzset
2. 獲取時(shí)間: time, ftime, gettimeofday
3. 時(shí)間格式轉(zhuǎn)換: mktime, strftime; gmtime, localtime; asctime, ctime
4. 其他: clock, difftime
asctime: 將時(shí)間和日期以字符串格式表示
頭文件: time.h
函數(shù)定義: char *asctime(const struct tm *timeptr);
說(shuō)明: asctime()將函數(shù)timeptr所指的tm結(jié)構(gòu)中的信息轉(zhuǎn)換成現(xiàn)實(shí)世界所使用的時(shí)間日期表示方法, 然后將結(jié)果以字符串形態(tài)返回. 此函數(shù)已經(jīng)由時(shí)區(qū)轉(zhuǎn)換成當(dāng)?shù)貢r(shí)間, 返回的字符串格式為: "Wed Jun 30 21:49:08 1993\n"
ctime: 將時(shí)間和日期以字符串格式表示
頭文件: time.h
函數(shù)定義: char *ctime(const time_t *timep);
說(shuō)明: ctime()同asctime()函數(shù), 只是輸入?yún)?shù)為time_t.
應(yīng)用舉例:
#include <stdio.h>
#include <time.h>
int main(void)
{
time_t timep;
time(&timep);
printf("%s", ctime(&timep));
printf("%s", asctime(gmtime(&timep)));
return 0;
}
運(yùn)行結(jié)果:
Sun Dec 14 15:30:11 2008
Sun Dec 14 15:30:11 2008
clock: 取得進(jìn)程占用CPU的大約時(shí)間
頭文件: time.h
函數(shù)定義: clock_t clock(void);
說(shuō)明: clock()用來(lái)返回進(jìn)程所占用CPU的大約時(shí)間.
difftime: 計(jì)算時(shí)間差距
頭文件: time.h
函數(shù)定義: double difftime(time_t time1, time_t time0);
說(shuō)明: difftime()用來(lái)計(jì)算參數(shù)time1-time0, 結(jié)果以double型精確值返回. 兩個(gè)參數(shù)的時(shí)間都是以1970年1月1日0時(shí)0分0秒算起的UTC時(shí)間.
ftime: 取得目前的時(shí)間和日期
頭文件: sys/timeb.h
函數(shù)定義: int ftime(struct timeb *tp);
說(shuō)明: ftime()將日前時(shí)間日期由參數(shù)tp所指的結(jié)構(gòu)輸出. tp結(jié)構(gòu)定義如下:
struct timeb{
/* 為從1970年1月1日至今的秒數(shù) */
time_t time;
/* 為千分之一秒 */
unsigned short millitm;
/* 為目前時(shí)區(qū)和Greenwich相差的時(shí)間, 單位為單位 */
short timezone;
/* 為日光節(jié)約時(shí)間的修正狀態(tài), 若非0為啟用日光節(jié)約時(shí)間的修正 */
short dstflag;
};
無(wú)論成功還是失敗都返回0.
應(yīng)用舉例:
#include <stdio.h>
#include <sys/timeb.h>
int main(void)
{
struct timeb tp;
ftime(&tp);
printf("time: %d\n", tp.time);
printf("millitm: %d\n", tp.millitm);
printf("timezone: %d\n", tp.timezone);
printf("dstflag: %d\n", tp.dstflag);
return 0;
}
運(yùn)行結(jié)果:
time: 1229271908
millitm: 716
timezone: -480
dstflag: 0
gettimeofday: 取得目前的時(shí)間
頭文件: sys/time.h unist.d
函數(shù)定義: int gettimeofday(struct timeval *tv, struct timezone *tz);
說(shuō)明: gettimeofday()會(huì)把目前的時(shí)間用tv所指的結(jié)構(gòu)返回, 當(dāng)?shù)貢r(shí)區(qū)的信息則放到tz所指的結(jié)構(gòu)中. 成功則返回0, 失敗返回-1, 錯(cuò)誤代碼存于errno. EFAULT是指針tv和tz所指的內(nèi)存空間超出存取權(quán)限.
timeval結(jié)構(gòu)定義為:
struct timeval{
/* 為從1970年1月1日至今的秒數(shù) */
long tv_sec;
/* 微秒 */
long tv_usec;
};
timezone 結(jié)構(gòu)定義為:
struct timezone{
/* 和Greenwich時(shí)間差了多少分鐘 */
int tz_minuteswest;
/*日光節(jié)約時(shí)間的狀態(tài)*/
int tz_dsttime;
};
上述兩個(gè)結(jié)構(gòu)都定義在/usr/include/sys/time.h, tz_dsttime所代表的狀態(tài)如下:
DST_NONE /*不使用*/
DST_USA /*美國(guó)*/
DST_AUST /*澳洲*/
DST_WET /*西歐*/
DST_MET /*中歐*/
DST_EET /*東歐*/
DST_CAN /*加拿大*/
DST_GB /*大不列顛*/
DST_RUM /*羅馬尼亞*/
DST_TUR /*土耳其*/
DST_AUSTALT /*澳洲(1986年以后)*/
gmtime: 將秒數(shù)轉(zhuǎn)換目前的時(shí)間和日期
頭文件: time.h
函數(shù)定義: struct tm *gmtime(const time_t *timep);
說(shuō)明: gmtime()將參數(shù)timep所指的time_t結(jié)構(gòu)中的信息轉(zhuǎn)換成現(xiàn)實(shí)世界所使用的時(shí)間日期表示方法, 然后將結(jié)果由結(jié)構(gòu)tm返回. 結(jié)構(gòu)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 代表目前秒數(shù), 正常范圍為0-59, 但允許至61秒
int tm_min 代表目前分?jǐn)?shù), 范圍0-59
int tm_hour 從午夜算起的時(shí)數(shù), 范圍為0-23
int tm_mday 目前月份的日數(shù), 范圍01-31
int tm_mon 代表目前月份, 從一月算起, 范圍從0-11
int tm_year 從1900年算起至今的年數(shù)
int tm_wday 一星期的日數(shù), 從星期一算起, 范圍為0-6
int tm_yday 從今年1月1日算起至今的天數(shù), 范圍為0-365
int tm_isdst 日光節(jié)約時(shí)間的旗標(biāo)
此函數(shù)返回的時(shí)間日期未經(jīng)時(shí)區(qū)轉(zhuǎn)換, 是UTC時(shí)間.
localtime: 將秒數(shù)轉(zhuǎn)換當(dāng)?shù)啬壳暗臅r(shí)間和日期
頭文件: time.h
函數(shù)定義: struct *localtime(const time_t *timep);
說(shuō)明: localtime()將參數(shù)timep所指的time_t結(jié)構(gòu)中的信息轉(zhuǎn)換成真實(shí)世界所使用的時(shí)間日期表示方法, 然后將結(jié)果由結(jié)構(gòu)tm返回. 結(jié)構(gòu)tm的定義請(qǐng)參考gmtime(). 此函數(shù)返回的時(shí)間日期已經(jīng)轉(zhuǎn)換成當(dāng)?shù)貢r(shí)區(qū).
mktime: 將時(shí)間結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)換成經(jīng)過(guò)的秒數(shù)
頭文件: time.h
函數(shù)定義: time_t mktime(struct tm *timeptr);
說(shuō)明: mktime()用來(lái)將參數(shù)timeptr所指的tm結(jié)構(gòu)數(shù)據(jù)轉(zhuǎn)換成從1970年1月1日0時(shí)0分0秒算起至今的UTC時(shí)間所經(jīng)過(guò)的秒數(shù). 返回經(jīng)過(guò)的秒數(shù).
settimeofday: 設(shè)置目前的時(shí)間
頭文件: sys/time.h unistd.h
函數(shù)定義: settimeofday()會(huì)把目前時(shí)間設(shè)成由tv所指的結(jié)構(gòu)信息, 當(dāng)?shù)貢r(shí)區(qū)信息則設(shè)成tz所指的結(jié)構(gòu). 詳細(xì)的說(shuō)明請(qǐng)參考gettimeofday(). 注意, 只有root權(quán)限才能使用此函數(shù)修改時(shí)間. 成功則返回0, 失敗返回-1, 錯(cuò)誤代碼存于errno.
錯(cuò)誤代碼:
EPERM 并非由root權(quán)限調(diào)用settimeofday(), 權(quán)限不夠
EINVAL 時(shí)區(qū)或某個(gè)數(shù)據(jù)是不正確的, 無(wú)法正確設(shè)置時(shí)間
strftime: 格式化日期和時(shí)間
頭文件: time.h
函數(shù)定義: size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);
說(shuō)明: strftime()會(huì)將參數(shù)tm的時(shí)間結(jié)構(gòu), 參照參數(shù)format所指定的字符串格式做轉(zhuǎn)換, 轉(zhuǎn)換后的字符串內(nèi)容將復(fù)制到參數(shù)s所指的字符串?dāng)?shù)組中, 該字符串的最大長(zhǎng)度為參數(shù)max所控制. 下面是參數(shù)format的格式指令:
%a 當(dāng)?shù)匦瞧谌掌诘拿Q(chēng)縮寫(xiě), 如: Sun
%A 當(dāng)?shù)匦瞧谌掌诘拿Q(chēng)縮寫(xiě), 如: Sunday
%b 當(dāng)?shù)卦路莸目s寫(xiě)
%B 當(dāng)?shù)卦路莸耐暾Q(chēng)
%c 當(dāng)?shù)剡m當(dāng)?shù)娜掌谂c時(shí)間表示法
%C 以year/100表示年份
%d 月里的天數(shù), 表示法為01-31
%D 相當(dāng)于"%m%d%y"格式
%e 月里的天數(shù), 表示法為1-31
%h 當(dāng)?shù)卦路莸目s寫(xiě)
%H 以24小時(shí)制表示小時(shí)數(shù), 表示法為00-23
%I 以12小時(shí)制表示小時(shí)數(shù), 表示法為01-12
%j 一年中的天數(shù)(001-366)
%k 以24小時(shí)制表示小時(shí)數(shù), 表示法為0-23
%l 以12小時(shí)制表示小時(shí)數(shù), 表示法為1-12
%m 月份(01-12)
%M 分鐘數(shù)(00-59)
%n 同\n
%p 顯示對(duì)應(yīng)的AM或PM
%P 顯示對(duì)應(yīng)的am或pm
%r 相當(dāng)于使用"%I:%M:%S %p"格式
%R 相當(dāng)于使用"%H:%M"格式
%s 從1970年1月1日0時(shí)0分0秒算起至今的UTC時(shí)間所經(jīng)過(guò)的秒數(shù)
%S 秒數(shù)(00-59)
%t 同\t
%T 24小時(shí)時(shí)間表示, 相當(dāng)于"%H:%M:%S"格式
%u 一星期中的星期日期, 范圍1-7, 星期一從1開(kāi)始
%U 一年中的星期數(shù)(00-53), 一月第一個(gè)星期日開(kāi)始為01
%w 一星期中的星期日期, 范圍0-6, 星期日從0開(kāi)始
%W 一年中的星期數(shù)(00-53), 一月第一個(gè)星期一開(kāi)始為01
%x 當(dāng)?shù)剡m當(dāng)?shù)娜掌诒硎?br> %X 當(dāng)?shù)剡m當(dāng)?shù)臅r(shí)間表示
%y 一世紀(jì)中的年份表示
%Y 完整的公元年份表示
%Z 使用的時(shí)區(qū)名稱(chēng)
%% '%'符號(hào)
返回復(fù)制到參數(shù)s所指的字符串?dāng)?shù)組的總字符數(shù), 不包括字符串結(jié)束符. 如果返回0, 表示未復(fù)制字符串到參數(shù)s內(nèi), 但不表示一定有錯(cuò)誤發(fā)生.
附加說(shuō)明: 環(huán)境變量TZ和TC_TIME會(huì)影響此函數(shù)結(jié)果.
應(yīng)用舉例:
#include <stdio.h>
#include <time.h>
int main(void)
{
char *format[] = {"%I: %M: %S %p %m/%d %a", "%x %X %Y", NULL};
char buf[30];
int i;
time_t clock;
struct tm *tm;
time(&clock);
tm = localtime(&clock);
for(i = 0; format[i] != NULL; i++)
{
strftime(buf, sizeof(buf), format[i], tm);
printf("%s => %s\n", format[i], buf);
}
return 0;
}
運(yùn)行結(jié)果:
%I: %M: %S %p %m/%d %a => 01: 46: 44 AM 12/15 Mon
%x %X %Y => 12/15/08 01:46:44 2008
time: 取得目前的時(shí)間
頭文件: time.h
函數(shù)定義: time_t time(time_t *t);
說(shuō)明: time()會(huì)返回從1970年1月1日從0時(shí)0分0秒算起的UTC時(shí)間到現(xiàn)在所經(jīng)過(guò)的秒數(shù). 如果t并非空指針的話, 此函數(shù)也會(huì)將返回值存到t指針?biāo)傅膬?nèi)存. 成功則返回秒數(shù), 失敗則返回(time_t-1)值, 錯(cuò)誤原因存于errno中.
tzset: 設(shè)置時(shí)區(qū)以供時(shí)間轉(zhuǎn)換
頭文件: time.h
函數(shù)定義: void tzset(void); extern char *tzname[2];
說(shuō)明: tzset()用來(lái)將環(huán)境變量TZ設(shè)給全局變量tzname, 也就是從環(huán)境變量取得目前當(dāng)?shù)氐臅r(shí)區(qū). 時(shí)間轉(zhuǎn)換函數(shù)會(huì)自動(dòng)調(diào)用此函數(shù). 若TZ為設(shè)置, tzname會(huì)依照/etc/localtime找出最接近當(dāng)?shù)氐臅r(shí)區(qū). 若TZ為NULL, 或是無(wú)法判認(rèn), 則使用UTC時(shí)區(qū). 此函數(shù)總是成功, 并且初始化tzname.