Linux与时间相关的结构体及相关用法
?
1. Linux下與時間有關的結構體
????????struct timeval
???????{ ?
???????????int tv_sec; ?
???????????int tv_usec; ?
???????}; ?
???????其中tv_sec是由凌晨開始算起的秒數,tv_usec則是微秒(10E-6 second)。 ?
???????struct timezone
???????{ ?
???????????int tv_minuteswest; ?
???????????int tv_dsttime; ?
???????}; ?
???????tv_minuteswest是格林威治時間往西方的時差,tv_dsttime則是時間的修正方式。 ?
???????struct timespec ?
???????{ ?
???????????long int tv_sec; ?
???????????long int tv_nsec; ?
???????}; ?
???????tv_nsec是nano second(10E-9 second)。 ?
???????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; ?
???????}; ?
???????tm_sec表「秒」數,在[0,61]之間,多出來的兩秒是用來處理跳秒問題用的。 ?
????????tm_min表「分」數,在[0,59]之間。 ?
???????tm_hour表「時」數,在[0,23]之間。 ?
???????tm_mday表「本月第幾日」,在[1,31]之間。 ?
???????tm_mon表「本年第幾月」,在[0,11]之間。 ?
???????tm_year要加1900表示那一年。 ?
???????tm_wday表「本第幾日」,在[0,6]之間。 ?
???????tm_yday表「本年第幾日」,在[0,365]之間,閏年有366日。 ?
???????tm_isdst表是否為「日光節約時間」。 ?
???????struct ?itimerval
???????{
?????????struct ?timeval it_interval;
?????????struct ?timeval it_value;
???????};
???????it_interval成員表示間隔計數器的初始值,而it_value成員表示間隔計數器的當前值。
??????? 2.獲得當前時間
???????在所有的UNIX下,都有個time()的函數 ?
??????time_t time(time_t *t);
??????這個函數會傳回從epoch開始計算起的秒數,如果t是non-null,它將會把時間值填入t中。 ?
???????對某些需要較高精準度的需求,Linux提供了gettimeofday()。 ?
??????int gettimeofday(struct timeval * tv,struct timezone *tz); ?
??????int settimeofday(const struct timeval * tv,const struct timezone *tz); ?
??????struct tm格式時間函數 ?
??????struct tm * gmtime(const time_t * t); ?
??????轉換成格林威治時間。有時稱為GMT或UTC。 ?
??????struct tm * localtime(const time_t *t); ?
??????轉換成本地時間。它可以透過修改TZ環境變數來在一臺機器中,不同使用者表示不同時間。 ?
??????time_t mktime(struct tm *tp); ?
??????轉換tm成為time_t格式,使用本地時間。 ?
??????tme_t timegm(strut tm *tp); ?
??????轉換tm成為time_t格式,使用UTC時間。 ?
??????double difftime(time_t t2,time_t t1); ?
??????計算秒差。 ?
??????3.文字時間格式函數 ?
??????char * asctime(struct tm *tp); ?
??????char * ctime(struct tm *tp); ?
??????這兩個函數都轉換時間格式為標準UNIX時間格式。 ?
??????Mon May 3 08:23:35 1999 ?
??????ctime一率使用當地時間,asctime則用tm結構內的timezone資訊來表示。 ?
??????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 : 讀取四位數年份。 ?
??????下面舉一個小例子,說明如何獲得系統當前時間:
??????????time_t now;
??????????struct tm ?*timenow;
??????????char strtemp[255];
??????
??????????time(&now);
??????????timenow = localtime(&now);
??????????printf("recent time is : %s \n", asctime(timenow));
| asctime(將時間和日期以字符串格式表示) | ? |
| 相關函數 | time,ctime,gmtime,localtime |
| 表頭文件 | #include<time.h> |
| 定義函數 | char * asctime(const struct tm * timeptr); |
| 函數說明 | asctime()將參數timeptr所指的tm結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果以字符串形態返回。此函數已經由時區轉換成當地時間,字符串格式為:“Wed Jun 30 21:49:08 1993\n” |
| 返回值 | 若再調用相關的時間日期函數,此字符串可能會被破壞。此函數與ctime不同處在于傳入的參數是不同的結構。 |
| 附加說明 | 返回一字符串表示目前當地的時間日期。 |
| 范例 | #include <time.h> |
| 執行 | Sat Oct 28 02:10:06 2000 |
| ctime(將時間和日期以字符串格式表示) | |
| 相關函數 | time,asctime,gmtime,localtime |
| 表頭文件 | #include<time.h> |
| 定義函數 | char *ctime(const time_t *timep); |
| 函數說明 | ctime()將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果以字符串形態返回。此函數已經由時區轉換成當地時間,字符串格式為“Wed Jun 30 21 :49 :08 1993\n”。若再調用相關的時間日期函數,此字符串可能會被破壞。 |
| 返回值 | 返回一字符串表示目前當地的時間日期。 |
| 范例 | #include<time.h> |
| 執行 | Sat Oct 28 10 : 12 : 05 2000 |
| gettimeofday(取得目前的時間) | |
| 相關函數 | time,ctime,ftime,settimeofday |
| 表頭文件 | #include <sys/time.h> |
| 定義函數 | int gettimeofday ( struct timeval * tv , struct timezone * tz ) |
| 函數說明 | gettimeofday()會把目前的時間有tv所指的結構返回,當地時區的信息則放到tz所指的結構中。 |
| 返回值 | 成功則返回0,失敗返回-1,錯誤代碼存于errno。附加說明EFAULT指針tv和tz所指的內存空間超出存取權限。 |
| 范例 | #include<sys/time.h> |
| 執行 | tv_sec: 974857339 |
| gmtime(取得目前時間和日期) | |
| 相關函數 | time,asctime,ctime,localtime |
| 表頭文件 | #include<time.h> |
| 定義函數 | struct tm*gmtime(const time_t*timep); |
| 函數說明 | gmtime()將參數timep 所指的time_t 結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果由結構tm返回。 |
| 返回值 | 返回結構tm代表目前UTC 時間 |
| 范例 | #include <time.h> |
| 執行 | 2000/10/28 Sat 8:15:38 |
| localtime(取得當地目前時間和日期) | |
| 相關函數 | time, asctime, ctime, gmtime |
| 表頭文件 | #include<time.h> |
| 定義函數 | struct tm *localtime(const time_t * timep); |
| 函數說明 | localtime()將參數timep所指的time_t結構中的信息轉換成真實世界所使用的時間日期表示方法,然后將結果由結構tm返回。結構tm的定義請參考gmtime()。此函數返回的時間日期已經轉換成當地時區。 |
| 返回值 | 返回結構tm代表目前的當地時間。 |
| 范例 | #include<time.h> |
| 執行 | 2000/10/28 Sat 11:12:22 |
| mktime(將時間結構數據轉換成經過的秒數) | |
| 相關函數 | time,asctime,gmtime,localtime |
| 表頭文件 | #include<time.h> |
| 定義函數 | time_t mktime(strcut tm * timeptr); |
| 函數說明 | mktime()用來將參數timeptr所指的tm結構數據轉換成從公元1970年1月1日0時0分0 秒算起至今的UTC時間所經過的秒數。 |
| 返回值 | 返回經過的秒數。 |
| 范例 |
|
| 執行 | time():974943297 |
| settimeofday(設置目前時間) | |
| 相關函數 | time,ctime,ftime,gettimeofday |
| 表頭文件 | #include<sys/time.h> |
| 定義函數 | int settimeofday ( const struct timeval *tv,const struct timezone *tz); |
| 函數說明 | settimeofday()會把目前時間設成由tv所指的結構信息,當地時區信息則設成tz所指的結構。詳細的說明請參考gettimeofday()。注意,只有root權限才能使用此函數修改時間。 |
| 返回值 | 成功則返回0,失敗返回-1,錯誤代碼存于errno。 |
| 錯誤代碼 | EPERM 并非由root權限調用settimeofday(),權限不夠。 |
| time(取得目前的時間) | |
| 相關函數 | ctime,ftime,gettimeofday |
| 表頭文件 | #include<time.h> |
| 定義函數 | time_t time(time_t *t); |
| 函數說明 | 此函數會返回從公元1970年1月1日的UTC時間從0時0分0秒算起到現在所經過的秒數。如果t 并非空指針的話,此函數也會將返回值存到t指針所指的內存。 |
| 返回值 | 成功則返回秒數,失敗則返回((time_t)-1)值,錯誤原因存于errno中。 |
| 范例 | #include<time.h> |
| #include <stdio.h> #include <time.h> int main () { ? struct tm tm, tm2; ? char buf[255]; ? time_t t1, t2; ? strptime ("Thu Feb 5 13:12:18 EST 2009", "%a %b %d %H:%M:%S EST %Y", &tm); ? strptime ("Fri Feb 6 13:11:18 EST 2009", "%a %b %d %H:%M:%S EST %Y", &tm2); ? t1 = mktime(&tm); ? t2 = mktime(&tm2); ? printf("TIME: %ld, %ld, %ld\n", t2, t1, t2-t1); ? return 0; }? |
總結
以上是生活随笔為你收集整理的Linux与时间相关的结构体及相关用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UNIX(多线程):13---condi
- 下一篇: Linux Linux 集群