先說一下c++標准庫並沒有提供所謂的日期類型,而是繼承了c的日期類型
<cmath>里面有些常用的函數,比如計時函數clock()、獲取系統時間的函數time(),下面就具體的介紹一下
1. clock()
c++中對clock()的定義為:clock_t clock(void);可以看出,clock為無參函數,返回clock_t型數據;它用於計算從程序啟動到調用該函數所占用
cpu的時間,若時間不可取,返回-1;默認計算時間為毫秒(ms)。下面說一下具體用法,先上代碼
#include<iostream> #include<ctime> using namespace std; int main() { clock_t start1=clock(); //計時開始 for(int i=0;i<100000000;) { ++i; } clock_t end1=clock(); //計時結束 clock_t start2=clock(); //計時開始 for(int i=0;i<200000000;i++) { ++i; } clock_t end2=clock(); //計時結束 cout<<"第一個for循環運行時間:"<<end1-start1<<"ms\n"; cout<<"第二個for循環運行時間:"<<end2-start2<<"ms\n"; cout<<"整個程序運行時間:"<<clock()<<"ms\n"; return 0; }
結果如下圖
第二個for循環運行時間基本上是第一個的2倍,整個程序的運行時間基本就是兩個for循環執行時間的總和。另外,現在輸的出的時間是毫秒,也可以
讓輸出的時間是秒s,這里就要介紹一下CLOCKS_PER_SEC了。CLOCKS_PER_SEC是定義在頭文件"time.h"中的一個常量,表示一秒鍾有多少個
時鍾計時單元,若要輸出時間為秒,就要用到這個常量。用法為:(double) clock()/CLOCKS_PER_SEC;只需要改一下上面的程序就行了,代碼如下:
#include<iostream> #include<ctime> using namespace std; int main() { clock_t start1=clock(); //計時開始 for(int i=0;i<100000000;) { ++i; } clock_t end1=clock(); //計時結束 clock_t start2=clock(); //計時開始 for(int i=0;i<200000000;i++) { ++i; } clock_t end2=clock(); //計時結束 cout<<"第一個for循環運行時間:"<<(double)(end1-start1)/CLOCKS_PER_SEC<<"s\n"; cout<<"第二個for循環運行時間:"<<(double)(end2-start2)/CLOCKS_PER_SEC<<"s\n"; cout<<"整個程序運行時間:"<<(double)clock()/CLOCKS_PER_SEC<<"s\n"; return 0; }
運行結果如下:
可以看到,輸出的時間變成了秒。
2. 下面再說一下如何獲取系統日期和時間
先介紹幾個函數,這些函數在"time.h"頭文件中的定義直接給了出來,方便理解。介紹這些函數之前先說一個概念——協調世界時,又叫世界標准時間,簡寫為UTC;
世界標准時間也就是常說的格林尼治時間。世界標准時間比中國區時間慢8小時(或者說晚8小時),二者總是相差8;如果UTC時間為:2020/04/23 8:00,那么中國
區時間為:2020/04/23 16:00。
(1) time_t time(time_t *time);函數time()返回time_t型數據;參數為time_t型指針,一般設置成空指針NULL或0;函數返回系統當前的日歷時間,自
1970年1月1日以來所經歷的秒數,這里要特別強調一下是所經歷的秒數撒;若系統沒有時間則返回1。
(2) char* ctime(const time_t *time);返回一個表示當地時間(中國區時間)的字符串指針,通過這個指針可以以字符串的形式輸出時間。
(3) struct tm* localtime(const time_t *time);把日歷時間轉化為本地時間;返回一個指向表示當地時間(即中國區時間)的tm結構體,tm結構體保存了這個本地時間,tm
在"time.h"頭文件中有定義,可以用tm來聲明一個指向此類型結構體的指針,下面來具體說一下tm結構體類型。tm結構體類型把日期和時間以c結構體的形式封裝了
起來,里面包含了年、月、日、時、分、秒等。具體如下:
struct tm
{
int tm_sec; //秒,[0,59]
int tm_min;//分鍾,[0,59]
int tm_hour;//小時,[0,23]
int tm_year;//年,用的時候要加1900
int tm_mon;//月,用的時候加1,因為范圍是[0,11]
int tm_mday; //日,[0,31]
int tm_wday;//表示星期幾,[0,6]
int tm_isdst; //沒用過,也沒查過
}
(4) struct tm* gmtime(const time_t *time); 這個函數和第(3)個函數有點類似,只不過它是把日歷時間轉化為世界標准時間,其他的基本和第(3)個函數一樣。
(5) size_t strftime();有四個參數,該函數可用於格式化日期和時間為指定格式來輸出。
另外說一下,clock_t、time_t、size_t、tm這四個類型能把系統時間和日期表示為某種整數。下面是具體用法,還是上代碼
#include<iostream> #include<ctime> using namespace std; int main() { time_t t=time(0); //返回自1970/01/01以來所經歷的秒數 char *pt=ctime(&t); tm *dt=localtime(&t); cout<<"所經歷的秒數:"<<t<<"\n"; cout<<pt; //以字符串的形式輸出當地時間,格式為系統默認的 cout<<"本地時間: "; cout<<dt->tm_year<<"/"<<dt->tm_mon<<"/"<<dt->tm_mday<<" 星期"<<dt->tm_wday<<" "; //輸出結構體中的日期和時間 cout<<dt->tm_hour<<":"<<dt->tm_min<<":"<<dt->tm_sec<<"\n"; dt=gmtime(&t); cout<<"世界標准時間:"; cout<<dt->tm_year<<"/"<<dt->tm_mon<<"/"<<dt->tm_mday<<" 星期"<<dt->tm_wday<<" "; //輸出結構體中的日期和時間 cout<<dt->tm_hour<<":"<<dt->tm_min<<":"<<dt->tm_sec<<"\n"; return 0; }
運行結果如下:
注意看本地時間與UTC的年和月是否和你電腦上的時間一樣,還有本地時間和UTC是否相差8。既然本地時間的年和月與電腦上的時間不一樣,那咋回事呢 ?
前面我說過年和月在使用的時候要分別加1900、1。 就是這個: int tm_year;//年,用的時候要加1900;int tm_mon;//月,用的時候加1,因為范圍是[0,11]
所以只要把上面的程序改一下就好了,改好的程序如下
1 #include<iostream> 2 #include<ctime> 3 using namespace std; 4 int main() 5 { 6 time_t t=time(0); //返回自1970/01/01以來所經歷的秒數 7 char *pt=ctime(&t); 8 tm *dt=localtime(&t); 9 cout<<"所經歷的秒數:"<<t<<"\n"; 10 cout<<pt; //以字符串的形式輸出當地時間,格式為系統默認的 11 cout<<"本地時間: "; 12 cout<<dt->tm_year+1900<<"/"<<dt->tm_mon+1<<"/"<<dt->tm_mday<<" 星期"<<dt->tm_wday<<" "; //輸出結構體中的日期和時間 13 cout<<dt->tm_hour<<":"<<dt->tm_min<<":"<<dt->tm_sec<<"\n"; 14 dt=gmtime(&t); 15 cout<<"世界標准時間:"; 16 cout<<dt->tm_year+1900<<"/"<<dt->tm_mon+1<<"/"<<dt->tm_mday<<" 星期"<<dt->tm_wday<<" "; //輸出結構體中的日期和時間 17 cout<<dt->tm_hour<<":"<<dt->tm_min<<":"<<dt->tm_sec<<"\n"; 18 return 0; 19 }
可以看出,在之前的程序的第12行和16行改了一下,加上了1900和1。運行結果如下:
現在就沒有錯誤了
另外本文寫的可能不夠詳細,可以看一下這個,寫的比較詳細:https://www.cnblogs.com/zhengfa-af/p/8312915.html
寫這篇文章我花了一下午的時間,最后還發生了一個插曲,就是在寫到最后的時候,電腦卡住了,顯示無響應,頁面一直無法操作,等了一會還是不行,沒辦法只能重啟,
md心態爆炸,一下午白搞了,真的要被氣死,不過晚上還是給搞完了,我感覺以后得用蘋果的電腦了。