C++11时间日期库chrono简介

时钟与时间点

时间间隔

 

chrono是C++11中新加入的时间日期操作库,可以方便地进行时间日期操作,主要包含了:duration, time_point, clock。

时钟与时间点

chrono中用time_point模板类表示时间点,其支持基本算术操作;不同时钟clock分别返回其对应类型的时间点。

clock

时钟是从一个时点开始,按照某个刻度的计数;chrono同时提供了三种时钟(通过now()获取当前时间点):

  • system_clock:系统时钟,相对epoch(1970-01-01 00:00:00UTC)的时间间隔;
  • steady_clock:单调时钟,只能增长(后一次调用now()得到的时间总是比前一次的值大);一般是相对于系统启动时间的时间间隔;
  • high_resolution_clock:高精度时钟(当前系统能提供的最高精度时钟,很可能就是steady_clock),也是单调的;

需要得到绝对时点的场景使用system_clock;需要得到时间间隔,且不受系统时间修改而受影响时使用steady_clock。

时间显示

在C++20中直接有to_stream直接输出system_clock时钟;但在此之前,只能通过间接的方式来输出:

auto tNow = system_clock::now();
auto tmNow = system_clock::to_time_t(tNow);
auto locNow = std::localtime(&tmNow);
cout<<std::put_time(locNow, "%Y-%m-%d %H:%M:%S")<<endl; // 2019-12-20 19:35:12

system_clock::from_time_t(...)可以把time_t类型时间转换为time_point,便于chrono使用。

运行计时

通过steady_clock/high_resolution_clock可方便的进行计时:

public:
  explicit XRunTime{bool bStart){
    if(bStart) Restart();
  }

  void Restart(){
    m_tpStart = high_resolution_clock::now();
  }

  double Stop(){
    return operator()();
  }
  double operator()(void){
    auto tpEnd = high_resolution_clock::now();
    auto elap = tpEnd - m_tpStart;
    return (double)elap.count() / std::nano::den; //返回运行的秒数,如1.00345
  }
}

时间间隔duration

chrono中使用duration模板类来表示时间间隔,并定义了从小时到纳秒的时间间隔。

duration模板

duration使用一个数值(表示时钟数)和分数(ratio)来表示具体间隔。支持基本的算术运算,并通过count()获取具体的时钟数。

template<typename _Rep, typename _Period = ratio<1>>
struct duration
{
  typedef _Rep   rep;

  constexpr _Rep count() const{
    return (_MyRep);
  }
  ...
private:
  _Rep  _MyRep;  //时钟计数
};

基准是秒,并依次定义了常用的间隔,如:

typedef duration<long long> seconds;
typedef duration<long long, milli> milliseconds;
typedef duration<long long, ratio<3600>> hours;

不同的时间间隔可以直接进行算术运算,如休眠需要毫秒参数,我们可以封装接收秒与毫秒的接口:

void MySleep(int nSec, int nMillSec){
  std::chrono::seconds secs(nSec);
  std::chrono::milliseconds mills(nMillSec);
  std::this_thread::sleep_for(secs+mills);
}

duration_cast

使用duration_cast可以方便的在不同时间单位间进行转换,如:

auto sec=seconds(123);
auto minu=duration_cast<minutes>(sec);
cout<<sec.count()<<","<<minu.count()<<endl; // 123,2

ratio

ratio是一个分数模板类,第一个参数为分子,第二个参数为分母;通过静态成员可获取:

  • num:分子
  • den:分母
typedef ratio<1, 1000> milli;
typedef ratio<1000, 1> kilo;
cout<<milli::den<<endl; // 1000
<think>嗯,用户想了解C++11chrono处理日期和时间的使用方法。首先,我需要回忆一下chrono的基本结构,然后根据用户提供的引用资料来组织答案。根据引用[2],chrono主要分为时钟、时间点、时长、一天中的时间、日历、时区和IO这几个部分。不过用户提到的是C++11,而日历和时区功能是在C++20才引入的,所以可能需要特别说明这部分内容。 接下来,用户需要具体的使用方法或文档,所以需要给出一些代码示例。例如,如何获取当前时间,计算时间差,转换时间单位等。引用[1]中的例子展示了如何使用时区转换,但C++11本身不支持时区,所以可能需要说明这是C++20的特性,或者使用其他如Boost。 还要注意用户的引用资料中提到了date(引用[3]),如果用户需要处理更复杂的日期操作,可能需要推荐这个第三方。同时,需要确保代码示例符合C++11标准,避免使用C++20的特性。 然后,根据用户提供的示例回答结构,应该分步骤讲解chrono的核心组件,并提供代码示例。例如,时钟部分介绍system_clock、steady_clock,时间点使用time_point,时长使用duration。代码示例可以包括获取当前时间、计算执行时间、类型转换和自定义时长单位。 最后,生成相关问题,比如如何做性能分析,如何处理时区,或者第三方的使用。这些问题需要与chrono相关,并且基于用户可能的进一步需求。</think>以下是关于C++11中`std::chrono`处理日期和时间的详细说明: ### 一、chrono的核心组件 1. **时钟(Clocks)** - `system_clock`:系统范围的实时时钟,可转换为日历时间 - `steady_clock`:稳定递增的时钟(适合测量时间间隔) - `high_resolution_clock`:最高精度的时钟(可能是前两者的别名) 2. **时间点(time_point)** 表示某个时钟的特定时间点: ```cpp auto now = std::chrono::system_clock::now(); ``` 3. **时长(duration)** 模板类表示时间间隔,支持单位转换: $$ \text{duration} = \text{计数次数} \times \text{时间单位} $$ ```cpp std::chrono::milliseconds ms(500); // 500毫秒 ``` ### 二、基础使用示例 ```cpp #include <chrono> #include <iostream> int main() { // 获取当前时间点 auto start = std::chrono::high_resolution_clock::now(); // 执行需要计时的操作 for(int i=0; i<1000000; ++i) {} // 计算时间差 auto end = std::chrono::high_resolution_clock::now(); auto duration = end - start; // 转换为不同时间单位 std::cout << "耗时:" << std::chrono::duration_cast<std::chrono::microseconds>(duration).count() << "微秒\n"; } ``` ### 三、关键特性说明 1. **时间单位转换** 通过`duration_cast`实现单位转换: ```cpp auto hours = std::chrono::duration_cast<std::chrono::hours>(duration); ``` 2. **自定义时间单位** 可定义任意时间单位: ```cpp using MyDuration = std::chrono::duration<double, std::ratio<1, 100>>; // 0.01秒单位 ``` 3. **时间点运算** 支持时间点与时长的加减运算: ```cpp auto future = now + std::chrono::hours(24); // 24小时后 ``` ### 四、注意事项 1. C++11chrono**不直接支持日历日期操作**,需结合`<ctime>`或使用C++20标准 2. 时区处理需要C++20的`<chrono>`扩展或第三方(如示例中的时区转换需要C++20支持)[^1][^2] 3. 对于复杂日期操作建议使用`date.h`第三方[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值