c++11提供了日期時間相關的庫 chrono,通過chrono庫可以很方便的處理日期和時間。
1. 記錄時間長度的duration
template<class Rep, class Period = std::ratio<1,1>> class Duration; //第一個模板參數Rep是一個數值類型,表示時鍾數的類型;第二個模板參數是一個默認模板參數 std::ratio,表示時鍾周期。 template<std::intmax_t Num, std::intmax_t Denom = 1> class ratio; //ratio表示分子除以分母得到的分數值,單位為秒。如 ratio<2> 表示一個時鍾周期為2秒,ratio<1,1000> 表示一個時鍾周期為1/1000秒。如有: typedef duration <Rep, ratio<3600,1> > hours; typedef duration<Rep, ratio<1,1>> seconds; typedef duration<Rep, ration<1,1000000>> microseconds; 通過定義這些常用的時間間隔類型,可以很方便的使用它們,比如線程的休眠: std::this_thread::sleep_for(std::chrono::seconds(3)); std::this_thread::sleep_for(std::chrono::microseconds(3));
duration可以進行運算,如計算兩個之差:
std::chrono::minutes t1(10); std::chrono::seconds t2(60); std::chrono::seconds t3 = t1 - t2; //只能為 minute向seconds,milliseconds轉換,不能反過來 std::cout << t3.count() << " seconds" << std::endl;
duration的加減運算有一定的規則,當兩個duration時鍾周期不相同的時候,先統一成一種時鍾,然后再做加減運算。統一成一種時鍾的規則如下:
對於 ration< x1, y1> count1, ration< x2, y2> count2; 如果x1, x2的最大公約數為x; y1, y2的最小公倍數為 y,則統一之后的ration 為 ration< x, y>.
chrono::duration<int, std::ratio<9, 7>> d1(3); std::chrono::duration<int, std::ratio<6, 5>> d2(1); auto d3 = d1 - d2; cout << typeid(d3).name() << endl; cout << d3.count() << endl; //得到的d3的 typeid(t3).name()為 std::chrono::duration<double, std::ration<3, 35>>;
duration可以進行不同時鍾周期的轉換,通過 duration_cast來實現:
std::chrono::minutes t1(10); std::chrono::seconds t2(60); std::chrono::milliseconds t3 = t1 -t2; std::cout << t3.count() << " milliseconds" << std::endl; std::cout << std::chrono::duration_cast<std::chrono::minutes>(t3).count() << " minutes" << std::endl; //將秒的時鍾周期轉換為分鍾的時鍾周期,然后通過count得到轉換后的分鍾時鍾周期的時間間隔
2. 表示時間點的time point
time_point表示一個時間點,用來獲取從它的clock的紀元開始所經過的duration(比如,可能是 1970.1.1以來的時間間隔)和當前的時間,可以做一些時間的比較和算術運算,可以和ctime庫結合起來顯示時間。
time_point必須使用clock來計時。
using namespace std::chrono; using days_type = duration < int, std::ratio<60 * 60 * 24> > ; time_point<system_clock, days_type> today = time_point_cast<days_type>(system_clock::now()); std::cout << today.time_since_epoch().count() << " days since epoch" << endl;
time_point還支持一些算術運算,比如兩個 time_point 的差值時鍾周期數,還可以和duration 相加減。要注意不同的clock的time_point是不能進行算術運算的。
system_clock::time_point now = system_clock::now(); std::time_t last = system_clock::to_time_t(now - hours(24)); std::time_t next = system_clock::to_time_t(now + hours(24)); std::cout << "one day ago, time was : " << std::asctime(std::localtime(&last)) << std::endl; std::cout << "one day after, time is : " << std::asctime(std::localtime(&next)) << std::endl;
3. 獲取系統時鍾的clocks
clocks分為以下三種:
(1)system_clock: 代表真實世界的掛鍾時間,具體時間值依賴於系統。system_clock保證提供的時間是一個可讀的時間。
(2)steady_clock: 不能被“調整”的時間,保證先后調用now()得到的時間值不會遞減
(3)high_resolution_clock: 高精度時間,實際上是system_clock或者steady_clock的別名,可以通過now()來獲取當前時間點
。
system_clock的to_time_t方法可以將一個time_point轉換為ctime, from_time_t 可以將一個ctime轉化為time_point:
std::time_t now_c = std::chrono::system_clock::to_time_t(now); std::chrono::time_point<std::chrono::system_clock> tp = std::chrono::system_clock::from_time_t(now_c);