天天看點

linux環境下的時間函數

函數分類:

1. 設定時間: settimeofday, tzset

2. 擷取時間: time, ftime, gettimeofday

3. 時間格式轉換: mktime, strftime; gmtime, localtime; asctime, ctime

4. 其他: clock, difftime

asctime: 将時間和日期以字元串格式表示

頭檔案: time.h

函數定義: char *asctime(const struct tm *timeptr);

說明: asctime()将函數timeptr所指的tm結構中的資訊轉換成現實世界所使用的時間日期表示方法, 然後将結果以字元串形态傳回. 此函數已經由時區轉換成當地時間, 傳回的字元串格式為: "Wed Jun 30 21:49:08 1993\n"

ctime: 将時間和日期以字元串格式表示

頭檔案: time.h

函數定義: char *ctime(const time_t *timep);

說明: ctime()同asctime()函數, 隻是輸入參數為time_t.

應用舉例:

#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;

}

運作結果:

Sun Dec 14 15:30:11 2008

Sun Dec 14 15:30:11 2008

clock: 取得程序占用CPU的大約時間

頭檔案: time.h

函數定義: clock_t clock(void);

說明: clock()用來傳回程序所占用CPU的大約時間.

difftime: 計算時間差距

頭檔案: time.h

函數定義: double difftime(time_t time1, time_t time0);

說明: difftime()用來計算參數time1-time0, 結果以double型精确值傳回. 兩個參數的時間都是以1970年1月1日0時0分0秒算起的UTC時間.

ftime: 取得目前的時間和日期

頭檔案: sys/timeb.h

函數定義: int ftime(struct timeb *tp);

說明: ftime()将日前時間日期由參數tp所指的結構輸出. tp結構定義如下:

struct timeb{

time_t time;

unsigned short millitm;

short timezone;

short dstflag; 

};

無論成功還是失敗都傳回0. 

應用舉例:

#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;

}

運作結果:

time: 1229271908

millitm: 716

timezone: -480

dstflag: 0

gettimeofday: 取得目前的時間

頭檔案: sys/time.h unist.d

函數定義: int gettimeofday(struct timeval *tv, struct timezone *tz);

說明: gettimeofday()會把目前的時間用tv所指的結構傳回, 當地時區的資訊則放到tz所指的結構中. 成功則傳回0, 失敗傳回-1, 錯誤代碼存于errno. EFAULT是指針tv和tz所指的記憶體空間超出存取權限.

timeval結構定義為:

struct timeval{

long tv_sec;

long tv_usec;

};

timezone 結構定義為:

struct timezone{

int tz_minuteswest;    

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

gmtime: 将秒數轉換目前的時間和日期

頭檔案: time.h

函數定義: 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時間.

localtime: 将秒數轉換當地目前的時間和日期

頭檔案: time.h

函數定義: struct *localtime(const time_t *timep);

說明: localtime()将參數timep所指的time_t結構中的資訊轉換成真實世界所使用的時間日期表示方法, 然後将結果由結構tm傳回. 結構tm的定義請參考gmtime(). 此函數傳回的時間日期已經轉換成當地時區.

mktime: 将時間結構資料轉換成經過的秒數

頭檔案: time.h

函數定義: time_t mktime(struct tm *timeptr);

說明: mktime()用來将參數timeptr所指的tm結構資料轉換成從1970年1月1日0時0分0秒算起至今的UTC時間所經過的秒數. 傳回經過的秒數.

settimeofday: 設定目前的時間

頭檔案: sys/time.h unistd.h

函數定義: settimeofday()會把目前時間設成由tv所指的結構資訊, 當地時區資訊則設成tz所指的結構. 詳細的說明請參考gettimeofday(). 注意, 隻有root權限才能使用此函數修改時間. 成功則傳回0, 失敗傳回-1, 錯誤代碼存于errno. 

錯誤代碼:

   EPERM   并非由root權限調用settimeofday(), 權限不夠 

   EINVAL 時區或某個資料是不正确的, 無法正确設定時間

strftime: 格式化日期和時間

頭檔案: time.h

函數定義: size_t strftime(char *s, size_t max, const char *format, const struct tm *tm);

說明: strftime()會将參數tm的時間結構, 參照參數format所指定的字元串格式做轉換, 轉換後的字元串内容将複制到參數s所指的字元串數組中, 該字元串的最大長度為參數max所控制. 下面是參數format的格式指令:

   %a 當地星期日期的名稱縮寫, 如: Sun

   %A 當地星期日期的名稱縮寫, 如: Sunday

   %b 當地月份的縮寫

   %B 當地月份的完整名稱

   %c 當地适當的日期與時間表示法

   %C 以year/100表示年份

   %d 月裡的天數, 表示法為01-31

   %D 相當于"%m%d%y"格式

   %e 月裡的天數, 表示法為1-31

   %h 當地月份的縮寫

   %H 以24小時制表示小時數, 表示法為00-23

   %I 以12小時制表示小時數, 表示法為01-12

   %j 一年中的天數(001-366)

   %k 以24小時制表示小時數, 表示法為0-23

   %l 以12小時制表示小時數, 表示法為1-12

   %m 月份(01-12)

   %M 分鐘數(00-59)

   %n 同\n

   %p 顯示對應的AM或PM

   %P 顯示對應的am或pm

   %r 相當于使用"%I:%M:%S %p"格式 

   %R 相當于使用"%H:%M"格式

   %s 從1970年1月1日0時0分0秒算起至今的UTC時間所經過的秒數

   %S 秒數(00-59)

   %t 同\t

   %T 24小時時間表示, 相當于"%H:%M:%S"格式

   %u 一星期中的星期日期, 範圍1-7, 星期一從1開始

   %U 一年中的星期數(00-53), 一月第一個星期日開始為01

   %w 一星期中的星期日期, 範圍0-6, 星期日從0開始

   %W 一年中的星期數(00-53), 一月第一個星期一開始為01

   %x 當地适當的日期表示

   %X 當地适當的時間表示

   %y 一世紀中的年份表示

   %Y 完整的公元年份表示

   %Z 使用的時區名稱

   %% '%'符号

傳回複制到參數s所指的字元串數組的總字元數, 不包括字元串結束符. 如果傳回0, 表示未複制字元串到參數s内, 但不表示一定有錯誤發生. 

附加說明: 環境變量TZ和TC_TIME會影響此函數結果.

應用舉例:

#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;

}

運作結果:

%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: 取得目前的時間

頭檔案: time.h

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

說明: time()會傳回從1970年1月1日從0時0分0秒算起的UTC時間到現在所經過的秒數. 如果t并非空指針的話, 此函數也會将傳回值存到t指針所指的記憶體. 成功則傳回秒數, 失敗則傳回(time_t-1)值, 錯誤原因存于errno中.

tzset: 設定時區以供時間轉換

頭檔案: time.h

函數定義: void tzset(void); extern char *tzname[2];

說明: tzset()用來将環境變量TZ設給全局變量tzname, 也就是從環境變量取得目前當地的時區. 時間轉換函數會自動調用此函數. 若TZ為設定, tzname會依照/etc/localtime找出最接近當地的時區. 若TZ為NULL, 或是無法判認, 則使用UTC時區. 此函數總是成功, 并且初始化tzname.

轉自:http://www.360doc.com/content/10/0428/11/474846_25251726.shtml

繼續閱讀