日期和时间库
来自 cppreference.cn
< 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 I/O (自 C++20 起)
定义于头文件
<chrono> | |
定义在命名空间
std::chrono 中 | |
(C++20) |
从流解析 chrono 对象(函数模板) |
[编辑] 注意
特性测试宏 | 值 | 标准 | 特性 |
---|---|---|---|
__cpp_lib_chrono |
201510L |
(C++17) | std::chrono::duration 和 std::chrono::time_point 的舍入函数 |
201611L |
(C++17) | constexpr 用于 std::chrono::duration 和 std::chrono::time_point 的所有成员函数 | |
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() { // 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