C/C++ 时间知识总结
文章目錄
- C/C++ 中時間的概念
- 常用的時間庫函數
- time()
- asctime()
- gmtime()
- ctime()
- localtime()
- mktime()
- strftime()
- difftime()
- C/C++ 獲取當前(本地)時間的方法
- 方法一
- 方法二
- 方法三
- 方法四
- 方法五
C/C++ 中時間的概念
Unix 時間戳(Unix timestamp),或稱 Unix 時間(Unix time)、POSIX 時間(POSIX time),是一種時間表示方式,定義為從格林威治時間1970年01月01日00時00分00秒起至現在的總秒數。time_t 就是用來存儲該數的一個類型,它是 unsigned long 類型。使用64位二進制數字表示時間的系統,最多可以使用到格林威治時間292,277,026,596年12月04日15時30分08秒。如果想要更精確一點,可以用結構 struct timeval,它可以精確到微秒:
struct timeval {long tv_sec; // 秒long tv_usec; // 微秒 };而直接存儲年月日時分秒等的是一個結構體:
struct tm {int tm_sec; // 秒,正常范圍0-59, 允許至61int tm_min; // 分鐘,0-59int tm_hour; // 小時, 0-23int tm_mday; // 日,一個月中的第幾天,1-31int tm_mon; // 月,從一月算起,0-11,1 + p->tm_mon;int tm_year; // 年,從1900至今已經多少年,1900 + p->tm_year;int tm_wday; // 星期,一周中的第幾天,從星期日算起,0-6int tm_yday; // 從今年1月1日到目前的天數,范圍0-365int tm_isdst; // 日光節約時間的旗標 };常用的時間庫函數
常用的時間函數都包含在頭文件 time.h/ctime(C/C++ 版本)中。
time()
time_t time(time_t *ptr);該函數返回得到當前日歷時間或者設置日歷時間,日歷時間即自格林威治時間(1970-01-01 00:00:00 UTC)起經過的時間,單位為秒。ptr 是一個指向類型為 time_t 對象的指針。如果 ptr 不為空,則返回值存儲在變量 ptr 中。一般給 ptr 傳遞0或者 NULL 值,如果傳遞的是非空地址,也能得到當前的日歷時間。
time_t t1 = time(0); time_t t2 = time(NULL); // 等價語句,三個對象存儲的都是同一個數值 time_t t3; time(&t3);asctime()
char *asctime(const struct tm *timeptr);該函數接受一個指向 tm 結構類型常量對象的指針 timeptr,返回一個指向字符串的指針,該字符串包含了可讀格式的日期和時間信息 :
wmdh:m:syw\ \ \ m\ \ \ d\ \ \ h:m:s\ \ \ yw???m???d???h:m:s???y其中,w 表示星期幾,m 是以字母表示的月份,d 表示一月中的第幾天,h : m : s 表示當前的時間,y 表示年份。asctime 函數常用于將結構中的信息轉換為真實世界的時間,以字符串的形式顯示。它計算得到的是世界統一時間。世界統一時間比北京時間早八個小時。比如當前北京時間是 8:41,利用 asctime 顯示的時間則為 00:41,這意味著日期也有可能會早一天。
gmtime()
struct tm *gmtime(const time_t *timer);該函數接受一個指向 time_t 類型常量對象的指針 timer,返回一個指向 tm 結構類型的指針。它使用 timer 的值來計算 tm 的各個成員變量,得到的是協調世界時。
ctime()
char *ctime(const time_t *timeptr);該函數接受一個指向 time_t 類型常量對象的指針 timeptr,返回一個指向字符串的指針,其與 asctime() 的返回類型和格式是一樣的。這兩個函數的區別在于傳入的參數類型不一樣,而且 ctime 返回的是本地時區時間。
localtime()
struct tm *localtime(const time_t *timer);該函數接受一個指向 time_t 類型常量對象的指針 timer,返回一個指向 tm 結構類型的指針。它使用 timer 的值來計算 tm 的各個成員變量,得到的是“本地時區時間”。
mktime()
time_t mktime(struct tm *timeptr)該函數接受一個指向 tm 結構類型常量對象的指針 timeptr,返回一個 time_t 類型的無符號整數。它的作用是將 timeptr 所指向的結構體變量轉換成自格林威治時間(1970-01-01 00:00:00 UTC)起經過的時間并返回,單位為秒,若發生錯誤返回-1。
strftime()
size_t strftime(char *str,size_t maxsize,const char *format,const struct tm *timeptr);該函數接受一個字符串str、一個無符號整數 maxsize,一個字符串 format 以及一個指向 tm 結構類型常量對象的指針。它的作用是將 timeptr 表示的時間按照格式化規則存儲在 str 中,maxsize 用來表示復制到 str 中的最大字符個數。如果 str 的字符個數(包含空字符 ‘\0’)小于 maxsize,則函數返回其字符個數,否則返回0。
size_t 是一個與機器相關的無符號整數類型,其大小足以保證存儲內存中的任意對象。例如數組下標的類型、vector 下標的類型實際上都是 size_t。
format 是一個 C 字符串,其中包含了普通字符和特殊格式說明符的任何組合。這些格式說明符由 strftime 函數識別,從而將 tm 中每個成員變量(參考前面 tm 結構中定義的各個整數)替換為相應的格式并存入 str 中。下表為格式說明符:
| %a | 縮寫的星期幾名稱,例如:Sun |
| %A | 完整的星期幾名稱,例如:Sunday |
| %b | 縮寫的月份名稱,例如:Mar |
| %B | 完整的月份名稱,例如:March |
| %c | 日期和時間表示法,例如:Sun Aug 19 02:56:02 2012 |
| %d | 一月中的第幾天(01-31),例如:19 |
| %F | 顯示年-月-日,例如:09-11-03 |
| %H | 24 小時格式的小時(00-23),例如:14 |
| %I | 12 小時格式的小時(01-12),例如:05 |
| %j | 一年中的第幾天(001-366),例如:231 |
| %m | 十進制數表示的月份(01-12),例如:08 |
| %M | 十進制表示的分鐘數(00-59),例如:55 |
| %p | AM 或 PM 名稱,例如:PM |
| %r | 12小時的時間,例如:9 |
| %R | 小時和分鐘,例如:08:29 |
| %S | 秒(00-61),例如:02 |
| %U | 一年中的第幾周,以第一個星期日作為第一周的第一天(00-53),例如:33 |
| %w | 十進制數表示的星期幾,星期日表示為 0(0-6),例如:4 |
| %W | 一年中的第幾周,以第一個星期一作為第一周的第一天(00-53),例如:34 |
| %x | 標準日期串,例如:08/19/12 |
| %X | 標準時間串,例如:02:50:06 |
| %y | 年份的最后兩個數字(00-99),例如:01 |
| %Y | 完整的年份,例如:2012 |
| %Z | 時區的名稱或縮寫,若得不到時區名稱則返回空串,例如:CDT |
| %% | 一個 % 符號,例如:% |
difftime()
double difftime(time_t time1, time_t time2)該函數接受兩個 time_t 類型的無符號整數并返回它們的差值,單位為秒。
C/C++ 獲取當前(本地)時間的方法
方法一
先獲取格林威治時間,再使用 localtime 函數獲取當前時間的 tm 結構類型變量,將其格式化后存入 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("當前時間:%s", str);return 0; }方法二
先獲取格林威治時間,使用 localtime 函數獲取當前時間的 tm 結構類型變量,再將其用 ctime 函數轉換成當前時間的字符串打印輸出:
#include <cstdio> #include <ctime>int main(void) {time_t t = time(0);struct tm *info = localtime(&t);printf("當前時間:%s", ctime(info));return 0; }方法三
先獲取格林威治時間,使用 localtime 函數獲取當前時間的 tm 結構類型變量,然后直接依據 tm 中的成員來計算我們想要打印的內容:
#include <cstdio> #include <ctime>int main() {char wday[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};time_t t = time(0); // 獲得time_t結構的時間,世界協調時struct tm *p;p = localtime(&t); // 轉換為 struct tm 結構的本地時間printf("%04d/%02d/%02d ", 1900 + p->tm_year, 1+ p->tm_mon, p->tm_mday); // 打印當前日期printf("%s %02d:%02d:%02d\n", wday[p->tm_wday], p->tm_hour, p->tm_min, p->tm_sec); // 打印當前時間return 0; }方法四
使用 windows 的 API,能夠精確到毫秒級。但是因為用的是 windows 下的函數,所以換了其他操作系統就不一定能用了:
#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; }方法五
利用系統函數,只顯示當前的時間,不顯示年月日這些。而且還能直接修改系統時間:
#include <cstdlib>int main() {system("time");return 0; }希望本篇博客能對你有所幫助,也希望看官能動動小手點個贊喲~~。
總結
以上是生活随笔為你收集整理的C/C++ 时间知识总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想笔记本系统重装,联想电脑重装系统
- 下一篇: 自定义mvc02