本文主要介紹 std::chrono日期和時間用法。 演示環境: vs2017
0、頭文件
1 #include <chrono> 2 #include <thread>// 如果需要使用線程
1、duration
其表示一段時間,可以是這段時間單位可以是秒、分鍾、小時、微秒,可以在 這里 看到詳情(突然抽風,上不去了),無法貼出相關定義源碼了。
一個例子,線程休眠2秒:
std::this_thread::sleep_for(std::chrono::seconds(2));
與之對應還有 nanoseconds、microseconds、milliseconds、minutes、hours。 因為看不到網頁內容,湊合看下Vs2017中chrono文件中的定義吧。
1 using nanoseconds = duration<long long, nano>; 2 using microseconds = duration<long long, micro>; 3 using milliseconds = duration<long long, milli>; 4 using seconds = duration<long long>; 5 using minutes = duration<int, ratio<60>>; 6 using hours = duration<int, ratio<3600>>;
(類)模板! 具體的定義,大家可以去 MSDN 看看或者 cppreference 看看,這里主要介紹的是用法。
函數【std::this_thread::sleep_for】的參數需要一個std::chrono的一個時間段。 比如,定義一個時間段:
1 // 5秒 2 std::chrono::seconds second(5); 3 // 2毫秒 4 std::chrono::microseconds micro_seconds(2);
std::chrono 類還提供了關於數值的運算,包括: +、-、-=、+=、/、*、/=、 *= 等。
一個例子,生活中常見的是小時、分、秒,這里舉例分鍾和秒做運算。
1 // 50秒 2 std::chrono::seconds second_50(50); 3 // 2mins 4 std::chrono::minutes minute_2(2); 5 6 // 用秒保存結果 7 std::chrono::seconds ret_val = minute_2 - second_50; 8 9 // 輸出當前結果 10 std::cout << ret_val.count();
這里,用 2分鍾 減 50 秒, 結果為 70秒。 調用 std::chrono::count() 獲取時鍾周期:
還可以將 秒 轉為 其他 格式輸出,比如,秒轉分鍾,需要函數 std::chrono::duration_cast<>() 幫忙。 用法如下:
std::cout << "ret_val = " << std::chrono::duration_cast<std::chrono::minutes>(ret_val).count();
注意: 這里得到的是 整數。比如,這里的結果, 70秒, 轉為分鍾, 結果顯示 1分鍾。
2、time_point
翻看 duration時,看到下面還有 time_point。 如名,其表示一個時間點,單位: 秒。 起始時間是 1970.1.1 00:00:00 。這樣,咱們可以分方便的計算 自 1970.1.1 00:00:00 后的當 某個時間點與 1970.1.1 00:00:00的間隔時間了。
其聲明如下(來自Vs2017,其定義太長,有興趣的可以了解下,這里僅給出定義):
template<class _Clock, class _Duration = typename _Clock::duration> class time_point;
它也是一個類模板,且需要搭配 duration和clock使用。
3、clock
Chrono提供了兩種的clock:
A、system_clock - 系統時間,系統時間可能被修改
B、steady_clock - 記錄時間,不會被修改。 換而言之,記錄的是已經流逝的真正時間。
通常,獲取當前時間點代碼:
std::chrono::steady_clock::time_point tp1 = std::chrono::steady_clock::now();
time_point類也提供了算數運算: += 、-=
一個例子:計算兩個時間點之間的間隔
1 std::chrono::steady_clock::time_point tp1 = std::chrono::steady_clock::now(); 2 // do something , 線程睡眠2秒 3 std::this_thread::sleep_for(std::chrono::seconds(2)); 4 std::chrono::steady_clock::time_point tp2 = std::chrono::steady_clock::now(); 5 6 std::cout << "time_interval = " << std::chrono::duration_cast<std::chrono::seconds>(tp2 - tp1).count() << "\n";
結果: