護(hù)膚品網(wǎng)站建設(shè)前的行業(yè)分析營銷軟文怎么寫
C++11之前,想要獲取時間并對其打印是有些困難的,因為C++并沒有標(biāo)準(zhǔn)時間庫。想要對時間進(jìn)行統(tǒng)計就需要調(diào)用C庫,并且我們要考慮這樣的調(diào)用是否能很好的封裝到我們的類中。
C++11之后,STL提供了 chrono
庫,其讓對時間的操作更加簡單。本節(jié),我們將會使用本地時間,并對本地時間進(jìn)行打印,還會給時間加上不同的偏移,這些操作很容易使用 std::chrono
完成。
#include <iostream>
#include <iomanip>
#include <chrono>
using namespace std;
using namespace std::literals;
ostream &operator<<(ostream &os,const chrono::time_point<chrono::system_clock>&t)
{const auto tt(chrono::system_clock::to_time_t(t));const auto loct(std::localtime(&tt));return os << put_time(loct, "%c");
}
int main()
{auto now(chrono::system_clock::now());cout << "現(xiàn)在時間為 " << now << '\n';chrono::hours chrono_12h{12};cout << "加上十二小時后:"<< (now + chrono_12h) << '\n';cout << "減去 12 小時 15分鐘后:"<< (now - 12h - 15min) << '\n';
}
現(xiàn)在時間為 03/04/23 10:58:28
加上十二小時后:03/04/23 22:58:28
減去 12 小時 15分鐘后:03/03/23 22:43:28
我們可以通過 std::chrono::system_clock
來獲取當(dāng)前時間點。這個STL時鐘類是唯一一個能將時間點的值轉(zhuǎn)換成一個時間結(jié)構(gòu)體的類型,其能將時間點以能夠看懂的方式進(jìn)行輸出。
為了打印這樣的時間點,我們可以對 operator<<
操作符進(jìn)行重載:
ostream &operator<<(ostream &os,const chrono::time_point<chrono::system_clock>&t)
{const auto tt(chrono::system_clock::to_time_t(t));const auto loct(std::localtime(&tt));return os << put_time(loct, "%c");
}
首先,將 chrono::time_point<chrono::system_clock>
轉(zhuǎn)換為 std::time_t 。然后,使用 std::localtime
將這個時間值進(jìn)行轉(zhuǎn)換,這樣就能獲取到一個本地時鐘的相對時間值。這個函數(shù)會給我們返回一個轉(zhuǎn)換后的指針(對于這個指針背后的內(nèi)存不用我們多操心,因為其是一個靜態(tài)對象,并不是從堆上分配的內(nèi)存),這樣我們就能完成最終的打印。
std::put_time
函數(shù)接受一個流對象和一個時間格式字符串。 %c
表示標(biāo)準(zhǔn)時間格式字符串,例如 Sun Mar 12 11:33:40 2017
。我們也可以寫成 %m/%d/%y
;之后,時間就會按照這個格式進(jìn)行打印,比如 03/12/17
。時間格式符的描述很長,想要了解其具體描述的最好方式就是去查看C++參考手冊。
除了打印,我們也會為我們的時間點添加偏移。這也很簡單,比如:12小時15分鐘就可以表示為 12h+15min
。 chrono_literals
命名空間為我們提供了字面類型: hours(h), minutes(min), seconds(s), milliseconds(ms), microseconds(us),nanoseconds(ns)
。通過對兩個時間間隔的相加,我們會得到一個新的時間點。