日期和时间工具
来自cppreference.com
< cpp
C++ 包含对二类时间操作的支持:
-
chrono
库,以各种精度跟踪时间的类型的灵活汇集(如 std::chrono::time_point)。 - C 风格日期和时间工具(如 std::time)。
std::chrono
库
chrono
库定义三种主要类型以及工具函数和常用 typedef。
- 时钟
- 时长
- 时间点
时钟
时钟由起点(或纪元)及计次频率组成。例如,时钟可以拥有 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) (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) |
抛出以报告本地时间不存在的异常 (类) |
(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