C++ 时间和日期工具

oneNeko 于 2022-04-24 发布

std::chrono库

<chrono>均被定义在std::chrono下,在C++11推出 <chrono>库定义三种主要类型以及工具函数和常用typedef:

时钟

时钟 说明
system_clock 来自系统范畴实时时钟的挂钟时间(可以不单调:系统时间可以在任何时候被调节。唯一有能力映射其时间点到C风格时间
steady_clock 决不会调整的单调时钟
high_resolution_clock 拥有可用的最短嘀嗒周期的时钟(不同标准库实现不一样,避免使用)

成员函数: now():表示当前时间点

system_clock::to_time_t:转换为time_t类型

system_clock::from_time_t:从time_t转换为时间点

时长

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

duration::count()函数返回返回计次的计数

duration::duration_cast转换 duration 为不同类型 ToDuration 的时长。

template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep,Period>& d);
// 参数
// d - 要转换的 duration
// 返回值
// 转换为 ToDuration 类型时长的 d 。

为方便使用,有预先定义好的宏

类型 定义 含义
nanoseconds duration</至少 64 位的有符号整数类型/, std::nano> 纳秒
microseconds duration</至少 55 位的有符号整数类型/, std::micro> 微秒
milliseconds duration</至少 45 位的有符号整数类型/, std::milli> 毫秒
seconds duration</至少 35 位的有符号整数类型/>
minutes duration</至少 29 位的有符号整数类型/, std::ratio<60»
hours duration</至少 23 位的有符号整数类型/, std::ratio<3600» 小时

时间点

time_point表示时间中的一个点

std::time

定义于头文件<ctime>std::time_t time( std::time_t* arg );

返回编码为std::time_t对象的当前日历时间,并将它存储于arg所指向的对象,除非arg是空指针。

std::tm* localtime( const std::time_t *time );,转换作为 std::time_t 值的从纪元起时间到以本地时间表达的日历时。

示例

计算耗时以毫秒计算

#include <chrono>
#include <iostream>
using namespace std::chrono;
int main() {
    auto start = steady_clock::now();

    int cnt = 0;
    for (int i = 0; i < 100000000; i++) {
        cnt++;
    }

    auto end = steady_clock::now();
    auto rep = duration_cast<milliseconds>(end - start).count();
    std::cout << "耗时"<<rep<<"ms";
    return 0;
}

参考

日期和时间工具