# std::chrono::time_point

< cpp‎ | chrono

定义于头文件 `<chrono>` |  |
template< class Clock, class Duration = typename Clock::duration > class time_point; |  | (C++11 起)

类模板 `std::chrono::time_point` 表示时间中的一个点。它被实现成如同存储一个 `Duration` 类型的自 `Clock` 的纪元起始开始的时间间隔的值。

`Clock` 必须满足时钟 (Clock) 的要求或为 std::chrono::local_t (C++20 起)。 | (C++23 前)

### 成员类型

成员类型 | 定义
`clock` | `Clock` ，此时间点在此时钟上计量
`duration` | `Duration` ，用于计量从纪元起时间的 std::chrono::duration 类型
`rep` | `Rep` ，表示时期的计次数的算术类型
`period` | `Period` ，表示时期周期的 std::ratio 类型

### 成员函数

(构造函数) | 构造新的 time_point (公开成员函数)
time_since_epoch | 返回表示为从其时钟起点开始的时间点 (公开成员函数)
operator+=operator-= | 以给定的 duration 修改 time_point (公开成员函数)
operator++operator++(int)operator--operator--(int) (C++20) | 自增或自减 duration (公开成员函数)
min [静态] | 返回对应最小时长的时间点 (公开静态成员函数)
max [静态] | 返回对应最大时长的时间点 (公开静态成员函数)

### 非成员函数

operator+operator- (C++11) | 实施涉及时间点的加法和减法运算 (函数模板)
operator==operator!=operator<operator<=operator>operator>=operator<=> (C++11)(C++11)(C++20 中移除)(C++11)(C++11)(C++11)(C++11)(C++20) | 比较两个时间点 (函数模板)
time_point_cast (C++11) | 转换时间点为同一时钟上拥有不同时长的另一时间点 (函数模板)
floor(std::chrono::time_point) (C++17) | 转换 time_point 到另一个，向下取整 (函数模板)
ceil(std::chrono::time_point) (C++17) | 转换 time_point 到另一个，向上取整 (函数模板)
round(std::chrono::time_point) (C++17) | 转换 time_point 到另一个，就近取整，偶数优先 (函数模板)

### 辅助类

std::common_type<std::chrono::time_point> (C++11) | 特化 std::common_type 特征 (类模板特化)

### 示例

    #include <algorithm>
    #include <iostream>
    #include <iomanip>
    #include <ctime>
    #include <chrono>

    void slow_motion()
    {
        static int a[] {1,2,3,4,5,6,7,8,9,10,11,12};
        while (std::ranges::next_permutation(a).found)
        { } // 生成 12! 个排列
    }

    int main()
    {
        using namespace std::literals; // 允许用 24h 、 1ms 、 1s 代替对应的
                                       // std::chrono::hours(24) 等待

        const std::chrono::time_point<std::chrono::system_clock> now =
            std::chrono::system_clock::now();
            // “生产代码”可以简化为：
            // const auto now = std::chrono::system_clock::now();

        const std::time_t t_c = std::chrono::system_clock::to_time_t(now - 24h);
        std::cout << "24 hours ago, the time was "
                  << std::put_time(std::localtime(&t_c), "%F %T.\n") << std::flush;

        const std::chrono::time_point<std::chrono::steady_clock> start =
            std::chrono::steady_clock::now();
            // “现实生活”的替用写法会是：
            // const auto start = std::chrono::steady_clock::now();

        slow_motion();

        const auto end = std::chrono::steady_clock::now();

        std::cout
          << "Slow calculations took "
          << std::chrono::duration_cast<std::chrono::microseconds>(end - start).count() << "µs ≈ "
          << (end - start) / 1ms << "ms ≈ " // 几乎等价于以上形式，
          << (end - start) / 1s << "s.\n";  // 但分别使用毫秒和秒
    }

可能的输出：

    24 hours ago, the time was 2021-02-15 18:28:52.
    Slow calculations took 2090448µs ≈ 2090ms ≈ 2s.

### 参阅

duration (C++11) | 时间区间 (类模板)