jef*_*jef 1 time c++11 c++-chrono
我正在 Linux 上开发 c++11 项目。现在我对时间库有一些要求。
我想利用时间...
最近我发现 std::chrono 及其比较函数非常有用。另一方面,我知道一些遗留库,例如 time.h。就我而言,最好的时间库是什么?我想选择最好的时间库。
<chrono>这个免费、开源的日期时间库位于更多日历计算和细节之上,您可能会发现它很有用。
- 访问日志的时间戳
- 人类友好的日志,例如“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()));
}
Run Code Online (Sandbox Code Playgroud)
我现在的输出是:
2017/07/08 18:00:19
Run Code Online (Sandbox Code Playgroud)
- 按秒比较上次访问和当前访问之间的时间
auto last_access = floor<seconds>(system_clock::now());
// ...
auto current_access = floor<seconds>(system_clock::now());
if (current_access > last_access)
// ...
Run Code Online (Sandbox Code Playgroud)
- 易于转换,utc <-> epoc
auto now = floor<seconds>(system_clock::now());
cout << format("%F %T %Z", now) << '\n';
cout << now.time_since_epoch() << '\n';
Run Code Online (Sandbox Code Playgroud)
输出:
2017-07-08 18:06:53 UTC
1499537213s
Run Code Online (Sandbox Code Playgroud)
哦,请注意,Unix 时间 15 亿秒即将到来:
cout << format("%F %T %Z\n", sys_seconds{1'500'000'000s});
2017-07-14 02:40:00 UTC
Run Code Online (Sandbox Code Playgroud)
该库现在是 C++20 的一部分。结果是<chrono>现在拥有<time.h>.
MSVS 有完整的实现。正在努力将其与 gcc 和 llvm 工具集一起发布。
std::chrono与传统定时器库相比,它具有许多优点:
std::steady_clock例如,如果不诉诸特定于平台的解决方案,仅使用旧版 API 很难实现 所提供的保证。需要注意的一个大缺点是,由于 chrono 是一个相对较年轻的库,因此实现更可能包含错误。我个人在 chrono 的 Boost 和 Visual C++ 2012 实现方面都遇到了一些小问题,虽然这些问题都不是关键问题,但处理起来并不令人愉快。
另请注意,chrono 明确排除了有关日期和日历的任何功能。为此功能提供了与 C API 的互操作。
个人建议:总体而言,API 之间的差异并不那么显着。您列出的简单用例应该相当容易使用这两个 API 实现,因此我建议您坚持使用最适合周围代码库的一个:如果您使用现代 C ++风格编写,那就不用担心模板和复杂类型,您会对 chrono 感到宾至如归。另一方面,如果您的代码更接近基于 C 的 POSIX API 的设计,time.h则可能更适合。