Date and time library
C++ 包含对两种时间操作类型的支持:
- chrono 库 ,一套灵活的类型集合,能以不同精度追踪时间(例如 std::chrono::time_point )。
- C 风格日期和时间库 (例如 std::time )。
目录 |
时间库 (自 C++11 起)
chrono
库定义了几种主要类型以及实用函数和通用类型别名:
| (自 C++20 起) |
时钟
时钟由一个起始点(或称纪元)和一个滴答速率组成。例如,某个时钟可能将1970年1月1日作为纪元,并以每秒一次的频率进行滴答。C++ 定义了多种时钟类型:
|
定义于头文件
<chrono>
|
|
|
定义于命名空间
std::chrono
|
|
|
(C++11)
|
来自系统全局实时时钟的挂钟时间
(类) |
|
(C++11)
|
永不调整的单调时钟
(类) |
|
(C++11)
|
具有最短滴答周期的可用时钟
(类) |
|
(C++20)
|
判断类型是否为
Clock
(类模板) (变量模板) |
|
(C++20)
|
用于协调世界时(UTC)的
Clock
(类) |
|
(C++20)
|
用于国际原子时(TAI)的
Clock
(类) |
|
(C++20)
|
用于GPS时间的
Clock
(类) |
|
(C++20)
|
用于
文件时间
的
Clock
(类型别名) |
|
(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小时制格式的时间之间转换
(函数) |
日历 (since 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)
|
用于创建公历日期的常规语法
(函数) |
时区 (since 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)
|
报告本地时间不明确的异常
(类) |
字面量 (since 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() { // 测量并显示函数调用的执行时间 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"; // C++20 之前 std::cout << elapsed_seconds << '\n'; // C++20 的 chrono::duration operator<< // 打印 UTC 和本地时间 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