日期與時間函式庫
出自 cppreference.com
< cpp
C++ 包含對兩類時間處理的支援
- chrono 函式庫,這是一個彈性的型別集合,能以不同的精確度追蹤時間(例如 std::chrono::time_point)。
- C 風格日期與時間函式庫(例如 std::time)。
目錄 |
[編輯] Chrono 函式庫 (自 C++11 起)
chrono 函式庫定義了數個主要型別,以及工具函式與常見的 typedef
|
(自 C++20 起) |
[編輯] 時鐘
時鐘由起始點(紀元,epoch)和計時頻率(tick rate)組成。例如,時鐘的紀元可以是 1970 年 1 月 1 日,並每秒計數一次。C++ 定義了多種時鐘型別
| 定義於標頭檔
<chrono> | |
| 定義於命名空間
std::chrono | |
| (C++11) |
來自系統全域即時時鐘的牆面時鐘時間 (class) |
| (C++11) |
永不調整的單調時鐘 (class) |
| (C++11) |
具有最短刻度週期的可用時鐘 (class) |
| (C++20) |
判斷一個型別是否為 Clock (class template) (variable template) |
| (C++20) |
用於協調世界時 (UTC) 的 Clock (類別) |
| (C++20) |
用於國際原子時 (TAI) 的 Clock (類別) |
| (C++20) |
用於 GPS 時間的 Clock (類別) |
| (C++20) |
用於檔案時間的時鐘 (typedef) |
| (C++20) |
代表當地時間的偽時鐘 (pseudo-clock) (類別) |
[編輯] 時間點
時間點是自特定時鐘的紀元起經過的時間段。
| 定義於標頭檔
<chrono> | |
| 定義於命名空間
std::chrono | |
| (C++11) |
時間上的一個點 (類別模板) |
| (C++20) |
定義如何將一個時鐘的時間點轉換為另一個時鐘的時間點的特性類別 (class template) |
| (C++20) |
將一個時鐘的時間點轉換為另一個時鐘的時間點 (function template) |
[編輯] 時間段
時間段由一段時間長度組成,定義為某個時間單位的計數值。例如,「42 秒」可以表示為一個包含 42 個 1 秒時間單位計數的時間段。
| 定義於標頭檔
<chrono> | |
| 定義於命名空間
std::chrono | |
| (C++11) |
一個時間區間 (class template) |
[編輯] 時刻 (自 C++20 起)
hh_mm_ss 將表示自午夜起經過的時間段拆分為小時、分鐘、秒和分數秒(適用時)。它主要是一個格式化工具。
| 定義於標頭檔
<chrono> | |
| 定義於命名空間
std::chrono | |
| (C++20) |
表示一天中的時刻 (類別模板) |
| (C++20) |
在 12 小時制/24 小時制的時刻之間進行轉換 (函式) |
[編輯] 曆法 (自 C++20 起)
| 定義於標頭檔
<chrono> | |
| 定義於命名空間
std::chrono | |
| (C++20) |
標記類別,用於指示月份中的「最後」一日或最後一個星期幾 (類別) |
| (C++20) |
表示月份中的某一日 (類別) |
| (C++20) |
表示一年中的某個月 (類別) |
| (C++20) |
表示公曆中的年份 (類別) |
| (C++20) |
表示公曆中的星期幾 (類別) |
| (C++20) |
表示月份中的第 n 個 weekday (class) |
| (C++20) |
表示月份中的最後一個 weekday (類別) |
| (C++20) |
表示特定 month 中的特定 day (類別) |
| (C++20) |
表示特定 month 的最後一日 (類別) |
| (C++20) |
表示特定 month 中的第 n 個 weekday (類別) |
| (C++20) |
表示特定 month 的最後一個 weekday (類別) |
| (C++20) |
表示特定 year 中的特定 month (類別) |
| (C++20) |
表示某個特定年份、月份和日期 (class) |
| (C++20) |
表示特定 year 和 month 的最後一日 (類別) |
| (C++20) |
表示特定 year 和 month 中的第 n 個 weekday (類別) |
| (C++20) |
表示特定 year 和 month 的最後一個 weekday (類別) |
| (C++20) |
格里曆日期建立的慣用語法 (function) |
[編輯] 時區 (自 C++20 起)
| 定義於標頭檔
<chrono> | |
| 定義於命名空間
std::chrono | |
| (C++20) |
描述一份 IANA 時區資料庫 的副本 (類別) |
| (C++20) |
表示 tzdb 的連結串列 (類別) |
| 存取與控制全域時區資料庫資訊 (function) | |
| (C++20) |
根據名稱定位一個 time_zone (函式) |
| (C++20) |
返回當前的 time_zone (函式) |
| (C++20) |
表示一個時區 (class) |
| (C++20) |
表示關於特定時間點的時區資訊 (類別) |
| (C++20) |
表示關於當地時間轉換為 UNIX 時間的資訊 (類別) |
| (C++20) |
選擇應如何解決模稜兩可的當地時間 (列舉) |
| (C++20) |
用於 zoned_time 的時區指標的特徵類別 (traits class) (類別模板) |
| (C++20) |
表示一個時區和一個時間點 (class) |
| (C++20) |
包含關於閏秒插入的資訊 (class) |
| (C++20) |
閏秒插入資訊 (class) |
| (C++20) |
從 utc_time 物件取得閏秒插入資訊(function template) |
| (C++20) |
表示時區的別名 (類別) |
| (C++20) |
拋出異常以報告本地時間不存在 (class) |
| (C++20) |
拋出異常以報告本地時間不明確 (class) |
[編輯] 字面量 (自 C++14 起)
| 定義於標頭檔
<chrono> | |
| 定義於內聯命名空間
std::literals::chrono_literals | |
| (C++20) |
表示特定年份的 std::chrono::year 字面值 (function) |
| (C++20) |
表示某個月中的一天的 std::chrono::day 字面值 (function) |
| (C++14) |
表示小時的 std::chrono::duration 字面值 (function) |
| (C++14) |
表示分鐘的 std::chrono::duration 字面值 (function) |
| (C++14) |
表示秒的 std::chrono::duration 字面值 (function) |
| (C++14) |
表示毫秒的 std::chrono::duration 字面值 (function) |
| (C++14) |
表示微秒的 std::chrono::duration 字面值 (function) |
| (C++14) |
表示奈秒的 std::chrono::duration 字面值 (function) |
[編輯] Chrono 輸入輸出 (自 C++20 起)
| 定義於標頭檔
<chrono> | |
| 定義於命名空間
std::chrono | |
| (C++20) |
從資料流中解析 chrono 物件(function template) |
[編輯] 註記
| 功能測試巨集 | 數值 | 標準 | 功能 |
|---|---|---|---|
__cpp_lib_chrono |
201510L |
(C++17) | 用於 std::chrono::duration 與 std::chrono::time_point 的捨入 (Rounding) 函式 |
201611L |
(C++17) | constexpr 用於 std::chrono::duration 與 std::chrono::time_point 的所有成員函式 | |
201907L |
(C++20) | 曆法與時區 | |
202306L |
(C++26) | std::chrono 值類別的 雜湊 (Hashing) 支援 |
[編輯] C 風格日期與時間函式庫
同時提供了 C 風格的日期與時間函式,例如 std::time_t、std::difftime 與 CLOCKS_PER_SEC。
[編輯] 範例
執行此程式碼
#include <chrono> #include <iostream> long Fibonacci(unsigned n) { return n < 2 ? n : Fibonacci(n - 1) + Fibonacci(n - 2); } int main() { // Measures and displays an execution time of a function call. const auto start{std::chrono::steady_clock::now()}; const auto fb{Fibonacci(42)}; const auto finish{std::chrono::steady_clock::now()}; const std::chrono::duration<double> elapsed_seconds{finish - start}; std::cout << "Fibonacci(42): " << fb << "\nElapsed time: "; // std::cout << elapsed_seconds.count() << "s\n"; // Before C++20 std::cout << elapsed_seconds << '\n'; // C++20's chrono::duration operator<< // Prints UTC and local time. const auto tp_utc{std::chrono::system_clock::now()}; std::cout << "Current time 'UTC' is: " << tp_utc << "\n" "Current time 'Local' is: " << std::chrono::current_zone()->to_local(tp_utc) << '\n'; }
可能輸出
Fibonacci(42): 267914296 Elapsed time: 0.728532s Current time 'UTC' is: 2025-02-10 06:22:39.420666960 Current time 'Local' is: 2025-02-10 09:22:39.420666960