c++11日期和时间工具-(std::chrono::system_clock)

本文详细介绍了C++标准库中的chrono模块,特别是std::chrono::system_clock类的使用方法及其实现细节,包括如何获取当前时间点、进行时间点转换等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义于头文件 <chrono>

std::chrono

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

  • 时钟
  • 时长
  • 时间点

来自系统范畴实时时钟的挂钟时间

std::chrono::system_clock
class system_clock;                  (C++11 起) 

std::chrono::system_clock 表示系统范围的实时壁钟。

它可以不单调:大多数系统上,系统时间可以在任何时候被调节。它是唯一有能力映射其时间点到 C 风格时间,从而能显示 (C++20 前)的 C++ 时钟。

std::chrono::system_clock 满足平凡时钟 (TrivialClock) 的要求。

成员类型

成员类型定义
rep表示时钟时长中计次数的有符号算术类型
period表示时钟计次周期的 std::ratio 类型,单位为秒
durationstd::chrono::duration<rep, period> ,足以表示负时长
time_pointstd::chrono::time_point<std::chrono::system_clock>

成员常量

constexpr bool is_steady

[静态]

若时间间隔计次始终为常数,即纵使在调整了外部时钟的情况下,调用 now() 的返回值亦单调递增,则为 true ;否则为 false

返回表示时间中当前点的 std::chrono::time_point

std::chrono::system_clock::now
static std::chrono::time_point<std::chrono::system_clock> 
now() noexcept;  (C++11 起) 

返回表示当前时间的时间点。

参数

(无)

返回值

表示当前时间的时间点。

调用示例

#include <iostream>
#include <vector>
#include <numeric>
#include <chrono>

volatile int sink;
int main()
{
    for (auto size = 1ull; size < 1000000000ull; size *= 100)
    {
        // 记录开始时间
//        auto start = std::chrono::system_clock::now();
        std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
        // 做一些工作
        std::vector<int> v(size, 100);
        sink = std::accumulate(v.begin(), v.end(), 0u); // 确保其副效应
        // 记录结束时间
        auto end = std::chrono::system_clock::now();
        std::chrono::duration<double> diff = end - start;
        std::cout << "Time to fill and iterate a vector of "
                  << size << " ints : " << diff.count() << " s\n";
    }
}

输出

转换系统时钟时间点为 std::time_t

std::chrono::system_clock::to_time_t
static std::time_t to_time_t
( const time_point& t ) noexcept;  (C++11 起) 

转换 t 为 std::time_t 类型。

若 std::time_t 拥有较低精度,则是舍入还是截断值是实现定义的。

参数

t-要转换的系统时钟时间点

返回值

表示 t 的 std::time_t 值。

调用示例

#include <iostream>
#include <vector>
#include <chrono>
#include<thread>

int main()
{
    int s = 1;
    for (auto size = 1ull; size < 1000000000ull; size *= 100)
    {
        // 记录开始时间
//        auto start = std::chrono::system_clock::now();
        std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
        // 做一些工作
        std::this_thread::sleep_for(std::chrono::seconds(s));
        // 记录结束时间
        auto end = std::chrono::system_clock::now();
        std::time_t start_t = std::chrono::system_clock::to_time_t(start);
        std::time_t end_t = std::chrono::system_clock::to_time_t(end);
        std::cout << "end_t( " << end_t << " ) -  start_t( " << start_t << " ) = " << end_t - start_t << std::endl;
        s++;
    }
}

输出

转换 std::time_t 到系统时钟时间点

std::chrono::system_clock::from_time_t
static std::chrono::system_clock::time_point 
from_time_t( std::time_t t ) noexcept; (C++11 起) 

用二个类型间的较低精度,转换 t 为时间点类型。

time_point 拥有较低精度,则舍入还是截断值是实现定义的。

参数

t-要转换的 std::time_t 值

返回值

表示 t 的 std::chrono::system_clock::time_point 类型值。

调用示例

#include <iostream>
#include <vector>
#include <chrono>
#include <thread>

int main()
{
    int s = 1;
    // 记录开始时间
//        auto start = std::chrono::system_clock::now();
    std::chrono::system_clock::time_point start = std::chrono::system_clock::now();
    std::time_t start_t = std::chrono::system_clock::to_time_t(start);
    for (auto size = 1ull; size < 1000000000ull; size *= 100)
    {
        // 记录结束时间
        auto end = std::chrono::system_clock::from_time_t(start_t + s);
        std::chrono::duration<double> diff = end - start;
        std::cout << "Time to fill "
                  << size << " ints : " << diff.count() << " s\n";
        s++;
    }
}

输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值