日期和时间库

出自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++20)
協調世界時 (UTC) 的時鐘
(類) [編輯]
(C++20)
國際原子時 (TAI) 的時鐘
(類) [編輯]
(C++20)
GPS 時間的時鐘
(類) [編輯]
用於文件時間時鐘
(typedef) [編輯]
(C++20)
表示本地時間的偽時鐘
(類) [編輯]

時間點

時間點是從特定時鐘的紀元開始經過的時間時長。

在標頭 <chrono> 定義
在命名空間 std::chrono 定義
時間中的點
(類模板) [編輯]
定義如何在時鐘間轉換時間點的特徵類
(類模板) [編輯]
轉換一個時鐘的時間點為另一個
(函數模板) [編輯]

時長

時長由時間跨度組成,定義為某���間單位的某個計次數。例如,「42 秒」可表示為由 42 個 1 秒時間點位的計次所組成的時長。

在標頭 <chrono> 定義
在命名空間 std::chrono 定義
(C++11)
時間區間
(類模板) [編輯]

當天時刻 (C++20 起)

若適用,hh_mm_ss 會將表示自午夜起經過時間的時長分割成時、分、秒和秒的小數部分。它主要是一種格式化工具。

在標頭 <chrono> 定義
在命名空間 std::chrono 定義
(C++20)
表示當天時刻
(類模板) [編輯]
在 12 時和 24 時格式的當天時刻之間翻譯
(函數) [編輯]

日曆 (C++20 起)

在標頭 <chrono> 定義
在命名空間 std::chrono 定義
(C++20)
指示一個月中最後一日或星期之日的標籤類
(類) [編輯]
(C++20)
表示月之日期
(類) [編輯]
(C++20)
表示年之月份
(類) [編輯]
(C++20)
表示格里高利曆中的年
(類) [編輯]
(C++20)
表示格里高利曆中星期之日
(類) [編輯]
表示月份的第 n 個 weekday
(類) [編輯]
表示月份的最後一個 weekday
(類) [編輯]
(C++20)
表示特定 month 的特定 day
(類) [編輯]
表示特定 month 的最後一日
(類) [編輯]
表示特定 month 的第 n 個 weekday
(類) [編輯]
表示特定 month 的最後一個 weekday
(類) [編輯]
表示特定 year 的特定 month
(類) [編輯]
表示特定的 yearmonthday
(類) [編輯]
表示特定 yearmonth 的最後一日
(類) [編輯]
表示特定 yearmonth 的第 n 個 weekday
(類) [編輯]
表示特定 yearmonth 的最後一個 weekday
(類) [編輯]
(C++20)
創建格里高利曆日期的約定語法
(函數) [編輯]

時區 (C++20 起)

在標頭 <chrono> 定義
在命名空間 std::chrono 定義
(C++20)
描述 IANA 時區資料庫的副本
(類) [編輯]
(C++20)
表示 tzdb 的鍊表
(類) [編輯]
訪問和控制全球時區資料庫信息
(函數) [編輯]
基於其名稱來定位 time_zone
(函數) [編輯]
返回當前的 time_zone
(函數) [編輯]
(C++20)
表示時區
(類) [編輯]
(C++20)
表示在特定時間點的關於時區的信息
(類) [編輯]
表示關於從本地時間轉換到 UNIX 時間的信息
(類) [編輯]
(C++20)
選擇解決本地時間的歧義的方式
(枚舉) [編輯]
zoned_time 所用的時區指針的特徵類
(類模板) [編輯]
表示時區和時間點
(類) [編輯]
含有關於插入閏秒的信息
(類) [編輯]
閏秒插入信息
(類) [編輯]
utc_time 對象獲得閏秒插入信息
(函數模板) [編輯]
表示時區的替用名
(類) [編輯]
用以報告本地時間不存在而拋出的異常
(類) [編輯]
為報告本地時間有歧義而拋出的異常
(類) [編輯]

字面量 (C++14 起)

在標頭 <chrono> 定義
在內聯命名空間 std::literals::chrono_literals 定義
表示特定年的 std::chrono::year 字面量
(函數) [編輯]
表示月內日期的 std::chrono::day 字面量
(函數) [編輯]
表示小時的 std::chrono::duration 字面量
(函數) [編輯]
表示分鐘的 std::chrono::duration 字面量
(函數) [編輯]
表示秒的 std::chrono::duration 字面量
(函數) [編輯]
表示毫秒的 std::chrono::duration 字面量
(函數) [編輯]
表示微秒的 std::chrono::duration 字面量
(函數) [編輯]
表示納秒的 std::chrono::duration 字面量
(函數) [編輯]

chrono 輸入/輸出 (C++20 起)

在標頭 <chrono> 定義
在命名空間 std::chrono 定義
(C++20)
從流分析 chrono 對象
(函數模板) [編輯]

註解

功能特性測試 標準 功能特性
__cpp_lib_chrono 201510L (C++17) std::chrono::durationstd::chrono::time_point 進行捨入的函數
201611L (C++17) std::chrono::durationstd::chrono::time_point 所有成員函數的 constexpr
201907L (C++20) 日曆時區
202306L (C++26) std::chrono 值類的散列支持

C 風格日期與時間庫

同時提供 C 風格日期與時間函數,例如 std::time_tstd::difftimeCLOCKS_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