日期和时间库
出自cppreference.com
< cpp
C++ 包含對二類時間操作的支持:
- chrono 庫,靈活匯集了一些以各種精度跟蹤時間的類型(如 std::chrono::time_point)。
- C 風格日期和時間工具(如 std::time)。
chrono 庫 (C++11 起)
chrono 庫定義數種主要類型以及工具函數和常用 typedef。
| (C++20 起) |
時鐘
時鐘由起點(或紀元)及計次頻率組成。例如,時鐘可以擁有 1970 年 1 月 1 日的紀元,和每一秒的計次。C++ 定義了以下幾種時鐘類型:
在標頭
<chrono> 定義 | |
在命名空間
std::chrono 定義 | |
(C++11) |
來自系統範疇實時時鐘的掛鐘時間 (類) |
(C++11) |
決不會調整的單調時鐘 (類) |
(C++11) |
擁有可用的最短計數周期的時鐘 (類) |
(C++20) |
確定類型是否為時鐘 (類模板) (變量模板) |
(C++20) |
協調世界時 (UTC) 的時鐘 (類) |
(C++20) |
國際原子時 (TAI) 的時鐘 (類) |
(C++20) |
GPS 時間的時鐘 (類) |
(C++20) |
用於文件時間的時鐘 (typedef) |
(C++20) |
表示本地時間的偽時鐘 (類) |
時間點
時間點是從特定時鐘的紀元開始經過的時間時長。
在標頭
<chrono> 定義 | |
在命名空間
std::chrono 定義 | |
(C++11) |
時間中的點 (類模板) |
(C++20) |
定義如何在時鐘間轉換時間點的特徵類 (類模板) |
(C++20) |
轉換一個時鐘的時間點為另一個 (函數模板) |
時長
時長由時間跨度組成,定義為某���間單位的某個計次數。例如,「42 秒」可表示為由 42 個 1 秒時間點位的計次所組成的時長。
在標頭
<chrono> 定義 | |
在命名空間
std::chrono 定義 | |
(C++11) |
時間區間 (類模板) |
當天時刻 (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 (類) |
(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) |
表示特定的 year、month 和 day (類) |
(C++20) |
表示特定 year 和 month 的最後一日 (類) |
(C++20) |
表示特定 year 和 month 的第 n 個 weekday (類) |
(C++20) |
表示特定 year 和 month 的最後一個 weekday (類) |
(C++20) |
創建格里高利曆日期的約定語法 (函數) |
時區 (C++20 起)
在標頭
<chrono> 定義 | |
在命名空間
std::chrono 定義 | |
(C++20) |
描述 IANA 時區資料庫的副本 (類) |
(C++20) |
表示 tzdb 的鍊表 (類) |
| 訪問和控制全球時區資料庫信息 (函數) | |
(C++20) |
基於其名稱來定位 time_zone (函數) |
(C++20) |
返回當前的 time_zone (函數) |
(C++20) |
表示時區 (類) |
(C++20) |
表示在特定時間點的關於時區的信息 (類) |
(C++20) |
表示關於從本地時間轉換到 UNIX 時間的信息 (類) |
(C++20) |
選擇解決本地時間的歧義的方式 (枚舉) |
(C++20) |
zoned_time 所用的時區指針的特徵類 (類模板) |
(C++20) |
表示時區和時間點 (類) |
(C++20) |
含有關於插入閏秒的信息 (類) |
(C++20) |
閏秒插入信息 (類) |
(C++20) |
從 utc_time 對象獲得閏秒插入信息 (函數模板) |
(C++20) |
表示時區的替用名 (類) |
(C++20) |
用以報告本地時間不存在而拋出的異常 (類) |
(C++20) |
為報告本地時間有歧義而拋出的異常 (類) |
字面量 (C++14 起)
在標頭
<chrono> 定義 | |
在內聯命名空間
std::literals::chrono_literals 定義 | |
(C++20) |
表示特定年的 std::chrono::year 字面量 (函數) |
(C++20) |
表示月內日期的 std::chrono::day 字面量 (函數) |
(C++14) |
表示小時的 std::chrono::duration 字面量 (函數) |
(C++14) |
表示分鐘的 std::chrono::duration 字面量 (函數) |
(C++14) |
表示秒的 std::chrono::duration 字面量 (函數) |
(C++14) |
表示毫秒的 std::chrono::duration 字面量 (函數) |
(C++14) |
表示微秒的 std::chrono::duration 字面量 (函數) |
(C++14) |
表示納秒的 std::chrono::duration 字面量 (函數) |
chrono 輸入/輸出 (C++20 起)
在標頭
<chrono> 定義 | |
在命名空間
std::chrono 定義 | |
(C++20) |
從流分析 chrono 對象 (函數模板) |
註解
| 功能特性測試宏 | 值 | 標準 | 功能特性 |
|---|---|---|---|
__cpp_lib_chrono |
201510L |
(C++17) | 對 std::chrono::duration 和 std::chrono::time_point 進行捨入的函數 |
201611L |
(C++17) | std::chrono::duration 和 std::chrono::time_point 所有成員函數的 constexpr
| |
201907L |
(C++20) | 日曆和時區 | |
202306L |
(C++26) | std::chrono 值類的散列支持
|
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()
{
// 测量并显示函数调用的执行时间。
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 << "\n经过时间:";
// std::cout << elapsed_seconds.count() << "s\n"; // C++20 前
std::cout << elapsed_seconds << '\n'; // C++20 的 chrono::duration operator<<
// 打印 UTC 和本地时间。
const auto tp_utc{std::chrono::system_clock::now()};
std::cout << "当前时间(UTC)为:" << tp_utc << "\n当前时间(本地)为:"
<< std::chrono::current_zone()->to_local(tp_utc) << '\n';
}
可能的輸出:
Fibonacci(42):267914296
经过时间:0.728532s
当前时间(UTC)为:2025-02-10 06:22:39.420666960
当前时间(本地)为:2025-02-10 09:22:39.420666960