C/C++中時(shí)間庫函數(shù)的使用詳解
C/C++ 中時(shí)間的概念
Unix 時(shí)間戳(Unix timestamp),或稱 Unix 時(shí)間(Unix time)、POSIX 時(shí)間(POSIX time),是一種時(shí)間表示方式,定義為從格林威治時(shí)間1970年01月01日00時(shí)00分00秒起至現(xiàn)在的總秒數(shù)。time_t 就是用來存儲(chǔ)該數(shù)的一個(gè)類型,它是 unsigned long 類型。使用64位二進(jìn)制數(shù)字表示時(shí)間的系統(tǒng),最多可以使用到格林威治時(shí)間292,277,026,596年12月04日15時(shí)30分08秒。如果想要更精確一點(diǎn),可以用結(jié)構(gòu) struct timeval,它可以精確到微秒:
struct timeval { long tv_sec; // 秒 long tv_usec; // 微秒 };
而直接存儲(chǔ)年月日時(shí)分秒等的是一個(gè)結(jié)構(gòu)體:
struct tm { int tm_sec; // 秒,正常范圍0-59, 允許至61 int tm_min; // 分鐘,0-59 int tm_hour; // 小時(shí), 0-23 int tm_mday; // 日,一個(gè)月中的第幾天,1-31 int tm_mon; // 月,從一月算起,0-11,1 + p->tm_mon; int tm_year; // 年,從1900至今已經(jīng)多少年,1900 + p->tm_year; int tm_wday; // 星期,一周中的第幾天,從星期日算起,0-6 int tm_yday; // 從今年1月1日到目前的天數(shù),范圍0-365 int tm_isdst; // 日光節(jié)約時(shí)間的旗標(biāo) };
常用的時(shí)間庫函數(shù)
常用的時(shí)間函數(shù)都包含在頭文件 time.h/ctime(C/C++ 版本)中。
time()
time_t time(time_t *ptr);
該函數(shù)返回得到當(dāng)前日歷時(shí)間或者設(shè)置日歷時(shí)間,日歷時(shí)間即自格林威治時(shí)間(1970-01-01 00:00:00 UTC)起經(jīng)過的時(shí)間,單位為秒。ptr 是一個(gè)指向類型為 time_t 對(duì)象的指針。如果 ptr 不為空,則返回值存儲(chǔ)在變量 ptr 中。一般給 ptr 傳遞0或者 NULL 值,如果傳遞的是非空地址,也能得到當(dāng)前的日歷時(shí)間。
time_t t1 = time(0); time_t t2 = time(NULL); // 等價(jià)語句,三個(gè)對(duì)象存儲(chǔ)的都是同一個(gè)數(shù)值 time_t t3; time(&t3);
asctime()
char *asctime(const struct tm *timeptr);
該函數(shù)接受一個(gè)指向 tm 結(jié)構(gòu)類型常量對(duì)象的指針 timeptr,返回一個(gè)指向字符串的指針,該字符串包含了可讀格式的日期和時(shí)間信息 :
w m d h:m:s y
其中,w 表示星期幾,m 是以字母表示的月份,d 表示一月中的第幾天,h : m : s 表示當(dāng)前的時(shí)間,y 表示年份。asctime 函數(shù)常用于將結(jié)構(gòu)中的信息轉(zhuǎn)換為真實(shí)世界的時(shí)間,以字符串的形式顯示。它計(jì)算得到的是世界統(tǒng)一時(shí)間。世界統(tǒng)一時(shí)間比北京時(shí)間早八個(gè)小時(shí)。比如當(dāng)前北京時(shí)間是 8:41,利用 asctime 顯示的時(shí)間則為 00:41,這意味著日期也有可能會(huì)早一天。
gmtime()
struct tm *gmtime(const time_t *timer);
該函數(shù)接受一個(gè)指向 time_t 類型常量對(duì)象的指針 timer,返回一個(gè)指向 tm 結(jié)構(gòu)類型的指針。它使用 timer 的值來計(jì)算 tm 的各個(gè)成員變量,得到的是協(xié)調(diào)世界時(shí)。
ctime()
char *ctime(const time_t *timeptr);
該函數(shù)接受一個(gè)指向 time_t 類型常量對(duì)象的指針 timeptr,返回一個(gè)指向字符串的指針,其與 asctime() 的返回類型和格式是一樣的。這兩個(gè)函數(shù)的區(qū)別在于傳入的參數(shù)類型不一樣,而且 ctime 返回的是本地時(shí)區(qū)時(shí)間。
localtime()
struct tm *localtime(const time_t *timer);
該函數(shù)接受一個(gè)指向 time_t 類型常量對(duì)象的指針 timer,返回一個(gè)指向 tm 結(jié)構(gòu)類型的指針。它使用 timer 的值來計(jì)算 tm 的各個(gè)成員變量,得到的是“本地時(shí)區(qū)時(shí)間”。
mktime()
time_t mktime(struct tm *timeptr)
該函數(shù)接受一個(gè)指向 tm 結(jié)構(gòu)類型常量對(duì)象的指針 timeptr,返回一個(gè) time_t 類型的無符號(hào)整數(shù)。它的作用是將 timeptr 所指向的結(jié)構(gòu)體變量轉(zhuǎn)換成自格林威治時(shí)間(1970-01-01 00:00:00 UTC)起經(jīng)過的時(shí)間并返回,單位為秒,若發(fā)生錯(cuò)誤返回-1。
strftime() size_t strftime( char *str, size_t maxsize, const char *format, const struct tm *timeptr);
該函數(shù)接受一個(gè)字符串str、一個(gè)無符號(hào)整數(shù) maxsize,一個(gè)字符串 format 以及一個(gè)指向 tm 結(jié)構(gòu)類型常量對(duì)象的指針。它的作用是將 timeptr 表示的時(shí)間按照格式化規(guī)則存儲(chǔ)在 str 中,maxsize 用來表示復(fù)制到 str 中的最大字符個(gè)數(shù)。如果 str 的字符個(gè)數(shù)(包含空字符 ‘\0’)小于 maxsize,則函數(shù)返回其字符個(gè)數(shù),否則返回0。
size_t 是一個(gè)與機(jī)器相關(guān)的無符號(hào)整數(shù)類型,其大小足以保證存儲(chǔ)內(nèi)存中的任意對(duì)象。例如數(shù)組下標(biāo)的類型、vector 下標(biāo)的類型實(shí)際上都是 size_t。
format 是一個(gè) C 字符串,其中包含了普通字符和特殊格式說明符的任何組合。這些格式說明符由 strftime 函數(shù)識(shí)別,從而將 tm 中每個(gè)成員變量(參考前面 tm 結(jié)構(gòu)中定義的各個(gè)整數(shù))替換為相應(yīng)的格式并存入 str 中。下表為格式說明符:
說明符 | 替換為 |
---|---|
%a | 縮寫的星期幾名稱,例如:Sun |
%A | 完整的星期幾名稱,例如:Sunday |
%b | 縮寫的月份名稱,例如:Mar |
%B | 完整的月份名稱,例如:March |
%c | 日期和時(shí)間表示法,例如:Sun Aug 19 02:56:02 2012 |
%d | 一月中的第幾天(01-31),例如:19 |
%F | 顯示年-月-日,例如:09-11-03 |
%H | 24 小時(shí)格式的小時(shí)(00-23),例如:14 |
%I | 12 小時(shí)格式的小時(shí)(01-12),例如:05 |
%j | 一年中的第幾天(001-366),例如:231 |
%m | 十進(jìn)制數(shù)表示的月份(01-12),例如:08 |
%M | 十進(jìn)制表示的分鐘數(shù)(00-59),例如:55 |
%p | AM 或 PM 名稱,例如:PM |
%r | 12小時(shí)的時(shí)間,例如:9 |
%R | 小時(shí)和分鐘,例如:08:29 |
%S | 秒(00-61),例如:02 |
%U | 一年中的第幾周,以第一個(gè)星期日作為第一周的第一天(00-53),例如:33 |
%w | 十進(jìn)制數(shù)表示的星期幾,星期日表示為 0(0-6),例如:4 |
%W | 一年中的第幾周,以第一個(gè)星期一作為第一周的第一天(00-53),例如:34 |
%x | 標(biāo)準(zhǔn)日期串,例如:08/19/12 |
%X | 標(biāo)準(zhǔn)時(shí)間串,例如:02:50:06 |
%y | 年份的最后兩個(gè)數(shù)字(00-99),例如:01 |
%Y | 完整的年份,例如:2012 |
%Z | 時(shí)區(qū)的名稱或縮寫,若得不到時(shí)區(qū)名稱則返回空串,例如:CDT |
%% | 一個(gè) % 符號(hào),例如:% |
difftime()
double difftime(time_t time1, time_t time2)
該函數(shù)接受兩個(gè) time_t 類型的無符號(hào)整數(shù)并返回它們的差值,單位為秒。
C/C++ 獲取當(dāng)前(本地)時(shí)間的方法
方法一
先獲取格林威治時(shí)間,再使用 localtime 函數(shù)獲取當(dāng)前時(shí)間的 tm 結(jié)構(gòu)類型變量,將其格式化后存入 str 再打印:
#include <cstdio> #include <ctime> int main(void) { time_t t = time(0); char str[64]; strftime(str, sizeof(str), "%Y/%m/%d %X %A 今年第%j天 %z", localtime(&t)); printf("當(dāng)前時(shí)間:%s", str); return 0; }
方法二
先獲取格林威治時(shí)間,使用 localtime 函數(shù)獲取當(dāng)前時(shí)間的 tm 結(jié)構(gòu)類型變量,再將其用 ctime 函數(shù)轉(zhuǎn)換成當(dāng)前時(shí)間的字符串打印輸出:
#include <cstdio> #include <ctime> int main(void) { time_t t = time(0); struct tm *info = localtime(&t); printf("當(dāng)前時(shí)間:%s", ctime(info)); return 0; }
方法三
先獲取格林威治時(shí)間,使用 localtime 函數(shù)獲取當(dāng)前時(shí)間的 tm 結(jié)構(gòu)類型變量,然后直接依據(jù) tm 中的成員來計(jì)算我們想要打印的內(nèi)容:
#include <cstdio> #include <ctime> int main() { char wday[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; time_t t = time(0); // 獲得time_t結(jié)構(gòu)的時(shí)間,世界協(xié)調(diào)時(shí) struct tm *p; p = localtime(&t); // 轉(zhuǎn)換為 struct tm 結(jié)構(gòu)的本地時(shí)間 printf("%04d/%02d/%02d ", 1900 + p->tm_year, 1+ p->tm_mon, p->tm_mday); // 打印當(dāng)前日期 printf("%s %02d:%02d:%02d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec); // 打印當(dāng)前時(shí)間 return 0; }
方法四
使用 windows 的 API,能夠精確到毫秒級(jí)。但是因?yàn)橛玫氖?windows 下的函數(shù),所以換了其他操作系統(tǒng)就不一定能用了:
#include <cstdio> #include <windows.h> int main() { SYSTEMTIME sys; GetLocalTime(&sys); printf("%4d-%02d-%02d %02d:%02d:%02d.%03d 星期%1d", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds, sys.wDayOfWeek); return 0; }
方法五
利用系統(tǒng)函數(shù),只顯示當(dāng)前的時(shí)間,不顯示年月日這些。而且還能直接修改系統(tǒng)時(shí)間:
#include <cstdlib> int main() { system("time"); return 0; }
到此這篇關(guān)于C/C++中時(shí)間庫函數(shù)的使用詳解的文章就介紹到這了,更多相關(guān)C/C++時(shí)間庫函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解如何在C/C++中測(cè)量一個(gè)函數(shù)或功能的運(yùn)行時(shí)間
本文算是一個(gè)比較完整的關(guān)于在 C/C++ 中測(cè)量一個(gè)函數(shù)或者功能的總結(jié),最后會(huì)演示三種方法的對(duì)比,文章通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng))
這篇文章主要介紹了VS?Code安裝及C、C++環(huán)境配置詳細(xì)教程(Windows系統(tǒng)),本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02C++ 實(shí)現(xiàn)優(yōu)先隊(duì)列的簡(jiǎn)單實(shí)例
這篇文章主要介紹了C++ 實(shí)現(xiàn)優(yōu)先隊(duì)列的簡(jiǎn)單實(shí)例的相關(guān)資料,希望通過本文能幫助大家實(shí)現(xiàn)優(yōu)先隊(duì)列,需要的朋友可以參考下2017-08-08Windows下Qt讀取系統(tǒng)的內(nèi)存、CPU、GPU等使用信息的示例代碼
在當(dāng)今計(jì)算機(jī)應(yīng)用廣泛的領(lǐng)域中,了解系統(tǒng)的內(nèi)存、CPU和GPU使用情況是非常重要的,本文將介紹如何使用Qt和Windows API來讀取系統(tǒng)的內(nèi)存、CPU和GPU使用詳細(xì)信息,將提供一個(gè)完整的示例代碼,需要的朋友可以參考下2024-01-01C語言通過二分查找實(shí)現(xiàn)猜數(shù)字游戲
這篇文章主要為大家詳細(xì)介紹了在C語言中如何通過二分查找思想編寫一個(gè)簡(jiǎn)單的猜數(shù)字游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02