日期和时间工具

来自cppreference.com
< cpp
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
日期和时间工具
时间点
(C++11)
(C++20)
时长
(C++11)
时钟
(C++11)      
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
当天时刻
(C++20)(C++20)
(C++20)(C++20)
(C++20)

日历
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)(C++20)
时区
(C++20)
(C++20)
(C++20)
chrono I/O
(C++20)
C 风格日期和时间
 

C++ 包含对二类时间操作的支持:

std::chrono

chrono 库定义三种主要类型以及工具函数和常用 typedef。

  • 时钟
  • 时长
  • 时间点

时钟

时钟由起点(或纪元)及计次频率组成。例如,时钟可以拥有 1970 年 1 月 1 日的纪元,和每一秒的计次。C++ 定义了以下几种时钟类型:

在标头 <chrono> 定义
在命名空间 std::chrono 定义
来自系统范畴实时时钟的挂钟时间
(类)
决不会调整的单调时钟
(类)
拥有可用的最短嘀嗒周期的时钟
(类)
确定类型是否为时钟 (Clock)
(类模板) (变量模板)
(C++20)
协调世界时 (UTC) 的时钟 (Clock)
(类)
(C++20)
国际原子时 (TAI) 的时钟 (Clock)
(类)
(C++20)
GPS 时间的时钟 (Clock)
(类)
用于文件时间时钟 (Clock)
(typedef)
(C++20)
表示本地时间的伪时钟
(类)

时间点

时间点是从特定时钟的纪元开始经过的时间时长。

在标头 <chrono> 定义
在命名空间 std::chrono 定义
时间中的点
(类模板)
定义如何转换一个时钟的时间点为另一个的特性类
(类模板)
转换一个时钟的时间点为另一个
(函数模板)

时长

时长由时间跨度组成,定义为某时间单位的某个计次数。例如,“42 秒”可表示为由 42 个 1 秒时间点位的计次所组成的时长。

在标头 <chrono> 定义
在命名空间 std::chrono 定义
(C++11)
时间区间
(类模板)

当天时刻

hh_mm_ss 只要可能就将表示自午夜起经过时间的时长分割成时、分、秒和秒的小数部分。它主要是格式化工具。

在标头 <chrono> 定义
在命名空间 std::chrono 定义
(C++20)
表示当天时刻
(类模板)
在 12 时和 24 时格式当天时刻之间翻译
(函数)

日历

在标头 <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
(类)
表示特定 year 的特定 month
(类)
表示特定的 yearmonthday
(类)
表示特定 yearmonth 的最后一日
(类)
表示特定 yearmonth 的第 n 个 weekday
(类)
表示特定 yearmonth 的最后一个 weekday
(类)
(C++20)
创建格里高利历日期的约定语法
(函数)

时区

在标头 <chrono> 定义
在命名空间 std::chrono 定义
(C++20)
描述 IANA 时区数据库的副本
(类)
(C++20)
表示 tzdb 的链表
(类)
访问和控制全球时区数据库信息
(函数)
定位基于其名称的 time_zone
(函数)
返回当前的 time_zone
(函数)
(C++20)
表示时区
(类)
(C++20)
表示在特定时间点的关于时区的信息
(类)
表示关于从本地时间转换到 UNIX 时间的信息
(类)
(C++20)
选择应如何解析歧义的本地时间
(枚举)
zoned_time 所用的时区指针的特性类
(类模板)
表示时区和时间点
(类)
含有关于插入闰秒的信息
(类)
表示时区的替用名
(类)
抛出以报告本地时间不存在的异常
(类)
抛出以报告本地时间有歧义的异常
(类)

字面量

在标头 <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 输入/输出

在标头 <chrono> 定义
在命名空间 std::chrono 定义
(C++20)
从流分析 chrono 对象
(函数模板)

注解

功能特性测试 标准 注释
__cpp_lib_chrono 201510L (C++17) std::chrono::durationstd::chrono::time_point 进行舍入的函数
201611L (C++17) std::chrono::durationstd::chrono::time_point 所有成员函数的 constexpr
201907L (C++20) 日历时区
202306L (C++26) std::chrono 值类的散列支持

C 风格日期与时间库

同时提供 C 风格日期与时间函数,例如 std::time_tstd::difftimeCLOCKS_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