Namespaces
Variants

Date and time library

From cppreference.net

C++ 包含对两种时间操作类型的支持:

目录

时间库 (自 C++11 起)

chrono 库定义了几种主要类型以及实用函数和通用类型别名:

(自 C++20 起)

时钟

时钟由一个起始点(或称纪元)和一个滴答速率组成。例如,某个时钟可能将1970年1月1日作为纪元,并以每秒一次的频率进行滴答。C++ 定义了多种时钟类型:

定义于头文件 <chrono>
定义于命名空间 std::chrono
来自系统全局实时时钟的挂钟时间
(类)
永不调整的单调时钟
(类)
具有最短滴答周期的可用时钟
(类)
判断类型是否为 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)
将一种时钟的时间点转换为另一种
(函数模板)

持续时间

一个时间段由某个时间跨度组成,定义为若干特定时间单位的滴答数。例如,"42秒"可以通过由42个1秒时间单位的滴答数组成的时间段来表示。

定义于头文件 <chrono>
定义于命名空间 std::chrono
(C++11)
时间间隔
(类模板)

一天中的时间 (始于 C++20)

hh_mm_ss 将表示自午夜以来经过时间的时长拆分为小时、分钟、秒以及适用的秒的小数部分。它主要是一个格式化工具。

定义于头文件 <chrono>
定义于命名空间 std::chrono
(C++20)
表示一天中的时间
(类模板)
在12小时制/24小时制格式的时间之间转换
(函数)

日历 (since C++20)

定义于头文件 <chrono>
定义于命名空间 std::chrono
(C++20)
标签类,指示月份中的 最后 一天或工作日
(类)
(C++20)
表示月份中的某一天
(类)
(C++20)
表示年份中的某个月份
(类)
(C++20)
表示公历中的年份
(类)
(C++20)
表示公历中的星期几
(类)
表示月份中第 n 个 weekday
(类)
表示月份中最后一个 weekday
(类)
(C++20)
表示特定 month 中的特定 day
(类)
表示特定 month 的最后一天
(类)
表示特定 month 中第 n 个 weekday
(类)
表示特定 month 中最后一个 weekday
(类)
(C++20)
表示特定 year 中的特定 month
(类)
表示特定的 year month day
(类)
表示特定 year month 的最后一天
(类)
表示特定 year month 中第 n 个 weekday
(类)
表示特定 year month 中最后一个 weekday
(类)
(C++20)
用于创建公历日期的常规语法
(函数)

时区 (since C++20)

定义于头文件 <chrono>
定义于命名空间 std::chrono
(C++20)
描述 IANA 时区数据库 的副本
(类)
(C++20)
表示 tzdb 的链表
(类)
访问和控制全局时区数据库信息
(函数)
根据名称定位 time_zone
(函数)
返回当前 time_zone
(函数)
(C++20)
表示一个时区
(类)
(C++20)
表示特定时间点的时区信息
(类)
(C++20)
表示本地时间到 UNIX 时间转换的信息
(类)
(C++20)
选择如何解析不明确的本地时间
(枚举)
用于 zoned_time 的时区指针特征类
(类模板)
(C++20)
表示一个时区和一个时间点
(类)
包含闰秒插入的信息
(类)
闰秒插入信息
(类)
utc_time 对象获取闰秒插入信息
(函数模板)
表示时区的替代名称
(类)
报告本地时间不存在的异常
(类)
报告本地时间不明确的异常
(类)

字面量 (since C++14)

定义于头文件 <chrono>
定义于内联命名空间 std::literals::chrono_literals
表示特定年份的 std::chrono::year 字面量
(函数)
表示月份中某一天的 std::chrono::day 字面量
(函数)
表示小时的 std::chrono::duration 字面量
(函数)
表示分钟的 std::chrono::duration 字面量
(函数)
表示秒的 std::chrono::duration 字面量
(函数)
表示毫秒的 std::chrono::duration 字面量
(函数)
表示微秒的 std::chrono::duration 字面量
(函数)
表示纳秒的 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