c++11之日期和時間庫


 

本文主要介紹 std::chrono日期和時間用法。 演示環境: vs2017

0、頭文件

1 #include <chrono>
2 #include <thread>// 如果需要使用線程

 

1、duration

  其表示一段時間,可以是這段時間單位可以是秒、分鍾、小時、微秒,可以在 這里  看到詳情(突然抽風,上不去了),無法貼出相關定義源碼了。 

  一個例子,線程休眠2秒:

std::this_thread::sleep_for(std::chrono::seconds(2));

  與之對應還有 nanosecondsmicrosecondsmillisecondsminuteshours。 因為看不到網頁內容,湊合看下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";

  結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM