与传统时间库相比,std :: chrono有哪些优势?

时间:2015-07-02 11:02:38

标签: c++11 time chrono

我在linux中开发c ++ 11项目。现在我对时间库有一些要求。

我想用时间......

  • 访问日志的时间戳
  • 比较上次访问和当前访问之间的秒数
  • 人类友好的日志,例如" 2014/01/3/18:32:32"
  • 易于转换,utc< - > EPOC

最近我发现std :: chrono及其比较函数非常有用。另一方面,我知道一些像time.h这样的遗留库。就我而言,什么是最好的时间库?我想选择最好的时间库。

2 个答案:

答案 0 :(得分:4)

std::chrono提供了许多优于传统计时器库的优势:

  • 具有便携性的高级时钟类型保证更接近现代系统的约束。例如,std::steady_clock提供的保证很难通过传统API实现,而无需借助特定于平台的解决方案。
  • 允许easy unit conversions的时间点和持续时间的类型安全值。
  • 与使用计时类型的other C++11 library components进行更好的互操作。

值得注意的一大缺点是,由于chrono是一个相对年轻的库,实现更有可能包含bug。我个人遇到了Boost和Visual C ++ 2012 chrono实现的几个小问题,虽然没有一个是关键的,但它们并不是很令人满意。

另请注意,chrono明确排除了有关日期和日历的任何功能。为此功能提供了interop with the C API

个人建议:总体而言,API之间的差异并不那么显着。您列出的简单用例应该相当容易用两个API实现,因此我建议您坚持使用最适合周围代码库的用例:如果您使用现代C ++编写< / em>风格,不怕模板和复杂类型,你会感到宾至如归。另一方面,如果您的代码更接近基于C的POSIX API的设计,time.h可能更适合。

答案 1 :(得分:4)

<chrono>之上分层,有更多的日历计算和细节,这可能会对您有用free, open source, date time library

  
      
  • 访问日志的时间戳
  •   
  • 人性化的日志,例如“2014/01/3/18:32:32”
  •   
#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << format("%Y/%m/%d %T\n", floor<seconds>(system_clock::now()));
}

刚刚给我输出的内容:

2017/07/08 18:00:19
  
      
  • 比较上次访问和当前访问之间的秒数
  •   
auto last_access = floor<seconds>(system_clock::now());
// ...
auto current_access = floor<seconds>(system_clock::now());
if (current_access > last_access)
    // ...
  
      
  • 易于转换,utc&lt; - &gt; EPOC
  •   
auto now = floor<seconds>(system_clock::now());
cout << format("%F %T %Z", now) << '\n';
cout << now.time_since_epoch() << '\n';

输出:

2017-07-08 18:06:53 UTC
1499537213s

哦,并且抬头,Unix时间15亿秒即将到来:

cout << format("%F %T %Z\n", sys_seconds{1'500'000'000s});

2017-07-14 02:40:00 UTC