日期和时间实用程序
来自 cppreference.com
< cpp
C++ 包含对两种类型的时间操作的支持
chrono
库,一个灵活的类型集合,用于跟踪具有不同精度的时间(例如 std::chrono::time_point)。- C 样式日期和时间库(例如 std::time)。
内容 |
[编辑] std::chrono
库
chrono
库定义了 三个(直到 C++20) 五个(自 C++20 起) 主要类型以及实用程序函数和常见类型定义
- 时钟,
- 时间点,
- 持续时间,
|
(自 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) |
时钟 用于 文件时间 (类型定义) |
(C++20) |
表示本地时间的伪时钟 (类) |
[编辑] 时间点
时间点是自特定时钟的纪元起经过的时间跨度。
在头文件
<chrono> 中定义 | |
在命名空间
std::chrono 中定义 | |
(C++11) |
一个时间点 (类模板) |
(C++20) |
特性类,定义如何将一个时钟的时间点转换为另一个时钟 (类模板) |
(C++20) |
将一个时钟的时间点转换为另一个时钟 (函数模板) |
[编辑] 持续时间
持续时间由一段时间跨度组成,定义为某个时间单位的某个滴答次数。例如,“42 秒”可以由持续时间表示,该持续时间由 42 个 1 秒时间单位的滴答组成。
在头文件
<chrono> 中定义 | |
在命名空间
std::chrono 中定义 | |
(C++11) |
一个时间间隔 (类模板) |
[编辑] 一天中的时间
hh_mm_ss
将表示自午夜开始经过的时间的持续时间拆分为小时、分钟、秒和小数秒(如果适用)。它主要是一个格式化工具。
在头文件
<chrono> 中定义 | |
在命名空间
std::chrono 中定义 | |
(C++20) |
表示一天中的时间 (类模板) |
(C++20) |
在 12 小时制/24 小时制时间格式之间转换 (函数) |
[编辑] 日历
在头文件
<chrono> 中定义 | |
在命名空间
std::chrono 中定义 | |
(C++20) |
表示一个月中的最后一个日期或星期几的标记类 (类) |
(C++20) |
表示一个月中的某一天 (类) |
(C++20) |
表示一年中的某个月 (类) |
(C++20) |
表示公历中的某一年 (类) |
(C++20) |
表示公历中的某一周 (类) |
(C++20) |
表示一个月中的第 n 个weekday (类) |
(C++20) |
表示一个月中的最后一个weekday (类) |
(C++20) |
表示特定day 的特定month (类) |
(C++20) |
表示特定month 的最后一天 (类) |
(C++20) |
表示特定month 中的第 n 个weekday (类) |
(C++20) |
表示特定month 中的最后一个weekday (类) |
(C++20) |
表示特定month 的特定year (类) |
(C++20) |
表示特定的year、month 和day (类) |
(C++20) |
表示特定year 和month 的最后一天 (类) |
(C++20) |
表示特定year 和month 中的第 n 个weekday (类) |
(C++20) |
表示特定year 和month 中的最后一个weekday (类) |
(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) |
抛出异常以报告本地时间不明确 (类) |
[编辑] 字面量
在头文件
<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
在头文件
<chrono> 中定义 | |
在命名空间
std::chrono 中定义 | |
(C++20) |
从流中解析 chrono 对象(函数模板) |
[编辑] 备注
特性测试 宏 | 值 | Std | 特性 |
---|---|---|---|
__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() { const auto start{std::chrono::steady_clock::now()}; const auto fb{Fibonacci(42)}; const auto end{std::chrono::steady_clock::now()}; const std::chrono::duration<double> elapsed_seconds{end - 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<< }
可能的输出
Fibonacci(42): 267914296 Elapsed time: 0.791429s