您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“怎么理解C語言中的time函數(shù)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
編程中經(jīng)常用到時間表達及轉(zhuǎn)換的函數(shù),它們都定義在 time.h 庫函數(shù)中,time函數(shù)的基本形式是time(),這個函數(shù)的原型是time_t time(time_t *time) |
幾個時間概念:
1:Coordinated Universal Time(UTC):
協(xié)調(diào)世界時,又稱世界標準時間,也即格林威治標準時間(Greenwich Mean Time,GMT),中國內(nèi)地的時間與UTC得時差為+8,也即UTC+8,美國為UTC-5。
2:Calendar Time:
日歷時間,是用"從一個標準時間點到此時的時間經(jīng)過的秒數(shù)"來表示的時間。標準時間點對不同編譯器可能會不同,但對一個編譯系統(tǒng)來說,標準時間是不變的。一般是表示距離UTC時間 1970-01-01 00:00:00的秒數(shù)。
3:epoch:
時間點。在標準c/c++中是一個整數(shù),用此時的時間和標準時間點相差的秒數(shù)(即日歷時間)來表示。
4:clock tick:
時鐘計時單元(而不叫做時鐘滴答次數(shù)),一個時鐘計時單元的時間長短是由cpu控制的,一個clock tick不是cpu的一個時鐘周期,而是c/c++的一個基本計時單位。
time.h 的定義
time.h 頭文件定義了四個變量類型、兩個宏和各種操作日期和時間的函數(shù)。
4個變量
size_t | 是無符號整數(shù)類型,它是 sizeof 關(guān)鍵字的結(jié)果。 |
---|---|
clock_t | 這是一個適合存儲處理器時間的類型,類型為unsigned long |
time_t | 這是一個適合存儲日歷時間類型。 |
struct tm | 這是一個用來保存時間和日期的結(jié)構(gòu)。 |
tm 結(jié)構(gòu)的定義如下:
struct tm { int tm_sec; /* 秒,范圍從 0 到 59 */ int tm_min; /* 分,范圍從 0 到 59 */ int tm_hour; /* 小時,范圍從 0 到 23 */ int tm_mday; /* 一月中的第幾天,范圍從 1 到 31 */ int tm_mon; /* 月,范圍從 0 到 11(注意) */ int tm_year; /* 自 1900 年起的年數(shù) */ int tm_wday; /* 一周中的第幾天,范圍從 0 到 6 */ int tm_yday; /* 一年中的第幾天,范圍從 0 到 365 */ int tm_isdst; /* 夏令時 */ };
兩個宏
NULL | 這個宏是一個空指針常量的值。 |
---|---|
CLOCKS_PER_SEC | 這個宏表示每秒的處理器時鐘個數(shù)。用于將clock()函數(shù)的結(jié)果轉(zhuǎn)化為以秒為單位的量,這個量的具體值是與操作系統(tǒng)相關(guān)的,通常為1000。 |
庫函數(shù)
1:clock函數(shù)
函數(shù)原型: clock_t clock(void)
函數(shù)返回:返回clock函數(shù)執(zhí)行起(一般為程序的開頭),處理器時鐘所使用的時間。
函數(shù)功能:用來計算程序或程序的某一段的執(zhí)行時間。
實例
#include#includeint main() { clock_t start_t,finish_t; double total_t = 0; int i = 0; start_t = clock(); for(;i<100000;++i) { //do someting; } finish_t = clock(); total_t = (double)(finish_t - start_t) / CLOCKS_PER_SEC;//將時間轉(zhuǎn)換為秒 printf("CPU 占用的總時間:%f\n", total_t); return 0; }
2:time函數(shù)
函數(shù)原型: time_t time(time_t *timer)
參數(shù)說明: timer=NULL時得到當前日歷時間(從1970-01-01 00:00:00到現(xiàn)在的秒數(shù)),timer=時間數(shù)值時,用于設(shè)置日歷時間,time_t是一個unsigned long類型。如果 timer不為空,則返回值也存儲在變量 timer中。
函數(shù)功能: 得到當前日歷時間或者設(shè)置日歷時間
函數(shù)返回: 當前日歷時間
實例
#include#includeint main () { time_t seconds; seconds = time(NULL); printf("自 1970-01-01 起的小時數(shù) = %ld\n", seconds/3600); return(0); }
3:asctime函數(shù)
函數(shù)原型: char* asctime(struct tm * ptr)
函數(shù)功能:將結(jié)構(gòu)struct tm * ptr所表示的時間以字符串表示
函數(shù)返回: 返回的時間字符串格式為:星期,月,日,小時:分:秒,年
參數(shù)說明: 結(jié)構(gòu)指針ptr應(yīng)通過函數(shù)localtime()或gmtime()得到
實例
#include#includeint main() { struct tm t;//更多情況下是通過localtime函數(shù)及gmtime函數(shù)獲得tm結(jié)構(gòu) t.tm_sec = 10; t.tm_min = 10; t.tm_hour = 6; t.tm_mday = 25; t.tm_mon = 2; t.tm_year = 89; t.tm_wday = 6; printf("%s\n",asctime(&t)); return(0); }
4:localtime函數(shù)
函數(shù)原型: struct tm *localtime(const time_t *timer)
函數(shù)功能: 使用 timer 的值來填充 tm 結(jié)構(gòu)。timer 的值被分解為 tm 結(jié)構(gòu),并用本地時區(qū)表示。
函數(shù)返回: 以tm結(jié)構(gòu)表達的時間
實例
#include#includeint main () { time_t timer; struct tm *Now; time( &timer ); Now = localtime( &timer ); printf("當前的本地時間和日期:%s", asctime(Now)); return(0); }
5:ctime函數(shù)
函數(shù)原型: char *ctime(const time_t * timer)
函數(shù)功能: 將日歷時間參數(shù)timer轉(zhuǎn)換為一個表示本地當前時間的字符串
函數(shù)返回: 返回字符串格式:星期,月,日,小時:分:秒,年
參數(shù)說明: timer參數(shù)應(yīng)由函數(shù)time獲得,其等價于 astime( localtime(timer) )
實例
#include#includeint main () { time_t curtime; time(&curtime); printf("當前時間 = %s", ctime(&curtime)); return(0); }
6:difftime函數(shù)
函數(shù)原型: double difftime(time_t time2, time_t time1)
函數(shù)功能: 得到兩次機器時間差,單位為秒
函數(shù)返回: 時間差,單位為秒
參數(shù)說明: time1,time2分別表示兩個不同的機器時間,該參數(shù)應(yīng)使用time函數(shù)獲得
實例
#include#includeint main() { time_t first,second; time(&first); sleep(2000); time(&second); printf("The difference is: %f seconds",difftime(second,first)); return 0; }
7:gmtime函數(shù)
函數(shù)原型: struct tm *gmtime(time_t *timer)
函數(shù)功能: 得到以結(jié)構(gòu)tm表示的時間信息,并用格林威治標準時間表示
函數(shù)返回: 以結(jié)構(gòu)tm表示的時間信息指針
參數(shù)說明: timer用函數(shù)time()得到的時間信息
實例
#include#include#define BST (+1) #define CCT (+8) int main () { time_t rawtime; struct tm *info; time(&rawtime); /* 獲取 GMT 時間 */ info = gmtime(&rawtime ); printf("當前的世界時鐘:\n"); printf("倫敦:%2d:%02d\n", (info->tm_hour+BST)%24, info->tm_min); printf("中國:%2d:%02d\n", (info->tm_hour+CCT)%24, info->tm_min); return(0); }
8:mktime函數(shù)
函數(shù)原型:time_t mktime(struct tm *timeptr)
函數(shù)功能:把 timeptr 所指向的結(jié)構(gòu)轉(zhuǎn)換為一個依據(jù)本地時區(qū)的 time_t 值
函數(shù)返回:該函數(shù)返回一個 time_t 值,該值對應(yīng)于以參數(shù)傳遞的日歷時間。如果發(fā)生錯誤,則返回 -1 值。
實例
#include#includeint main () { int ret; struct tm info; char buffer[80]; info.tm_year = 2001 - 1900; info.tm_mon = 7 - 1; info.tm_mday = 4; info.tm_hour = 0; info.tm_min = 0; info.tm_sec = 1; info.tm_isdst = -1; ret = mktime(&info); if( ret == -1 ) { printf("錯誤:不能使用 mktime 轉(zhuǎn)換時間。\n"); } else { strftime(buffer, sizeof(buffer), "%c", &info ); print(buffer); } return(0); }
9:strftime函數(shù)
函數(shù)原型: size_t strftime( char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
函數(shù)功能: 根據(jù)format指向字符串中格式 命令把timeptr中保存的時間信息放在strDest指向的字符串中,最多向 strDest中存放maxsize個字符。
參數(shù)說明: 轉(zhuǎn)化結(jié)果存在s中,最多maxsize個字符寫到s中
函數(shù)返回: 該函數(shù)返回向strDest指向的字符串中放置的字符數(shù)(不包括'\0'),如果字符數(shù)多于maxsize,函數(shù)返回0。
實例
/*format如下:它們是區(qū)分大小寫的。 %a 星期幾的簡寫 %A 星期幾的全稱 %b 月分的簡寫 %B 月份的全稱 %c 標準的日期的時間串 %C 年份的后兩位數(shù)字 %d 十進制表示的每月的第幾天 %D 月/天/年 %e 在兩字符域中,十進制表示的每月的第幾天 %F 年-月-日 %g 年份的后兩位數(shù)字,使用基于周的年 %G 年分,使用基于周的年 %h 簡寫的月份名 %H 24小時制的小時 %I 12小時制的小時 %j 十進制表示的每年的第幾天 %m 十進制表示的月份 %M 十時制表示的分鐘數(shù) %n 新行符 %p 本地的AM或PM的等價顯示 %r 12小時的時間 %R 顯示小時和分鐘:hh:mm %S 十進制的秒數(shù) %t 水平制表符 %T 顯示時分秒:hh:mm:ss %u 每周的第幾天,星期一為第一天 (值從0到6,星期一為0) %U 第年的第幾周,把星期日做為第一天(值從0到53) %V 每年的第幾周,使用基于周的年 %w 十進制表示的星期幾(值從0到6,星期天為0) %W 每年的第幾周,把星期一做為第一天(值從0到53) %x 標準的日期串 %X 標準的時間串 %y 不帶世紀的十進制年份(值從0到99) %Y 帶世紀部分的十進制年份 %z,%Z 時區(qū)名稱,如果不能得到時區(qū)名稱則返回空字符。 %% 百分號 */ #include#includeint main () { time_t rawtime; struct tm *info; char buffer[80]; time( &rawtime ); info = localtime( &rawtime ); strftime(buffer,80,"%Y%m%e_%H%M%S", info);//以年月日_時分秒的形式表示當前時間 printf("%s\n", buffer ); return(0); }
“怎么理解C語言中的time函數(shù)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。