日期和时间库
来自 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) |
确定类型是否为 Clock (类模板) (变量模板) |
(C++20) |
Clock,用于协调世界时 (UTC) (类) |
(C++20) |
Clock,用于国际原子时 (TAI) (类) |
(C++20) |
Clock,用于 GPS 时间 (类) |
(C++20) |
Clock,用于 文件时间 (typedef) |
(C++20) |
表示本地时间的伪时钟 (类) |
[编辑] 时间点
时间点是自特定时钟的纪元以来经过的时间量。
定义于头文件
<chrono> | |
定义于命名空间
std::chrono | |
(C++11) |
时间中的一个点 (类模板) |
(C++20) |
定义如何将一个时钟的时间点转换为另一个时钟的时间点的 traits 类 (类模板) |
(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 使用的时区指针的 traits 类 (类模板) |
(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) | 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