日期和时间工具
< cpp
C++ 包含对二类时间操作的支持:
chrono库,灵活汇集了一些以各种精度跟踪时间的类型(如 std::chrono::time_point)。- C 风格日期和时间工具(如 std::time)。
 
std::chrono 库
chrono 库定义三种 (C++20 前)五种 (C++20 起)主要类型以及工具函数和常用 typedef。
- 时钟(clock),
 - 时间点(time point),
 - 时长(duration),
 
  | 
(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) 
 | 
时间区间 (类模板)  | 
当天时刻
若适用,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) 
 | 
表示特定 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) 
 | 
创建格里高利历日期的约定语法 (函数)  | 
时区
| 
 在标头  
<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 输入/输出
| 
 在标头  
<chrono> 定义 | 
|
| 
 在命名空间  
std::chrono 定义 | 
|
| 
 (C++20) 
 | 
从流分析 chrono 对象(函数模板)  | 
注解
| 功能特性测试宏 | 值 | 标准 | 功能特性 | 
|---|---|---|---|
__cpp_lib_chrono | 
201510L | (C++17) | 对 std::chrono::duration 和 std::chrono::time_point 进行舍入的函数 | 
| 201611L | (C++17) | std::chrono::duration 和 std::chrono::time_point 所有成员函数的 constexpr | |
| 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 << "\n经过时间:"; // std::cout << elapsed_seconds.count() << "s\n"; // C++20 前 std::cout << elapsed_seconds << '\n'; // C++20 的 chrono::duration operator<< }
可能的输出:
Fibonacci(42):267914296 经过时间:0.791429s