首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可读的chrono::time_point<chrono::high_resolution_clock>打印C++

可读的chrono::time_point<chrono::high_resolution_clock>打印C++
EN

Stack Overflow用户
提问于 2020-07-17 12:42:16
回答 1查看 1.5K关注 0票数 4

我有自Epoch以来的纳秒数,我想打印这个以便于阅读。

我发现的在线打印time_point的例子是使用system_clock,然后转换成std::time_t。然而,我使用的是high_resolution_clock (因为纳秒),因此我很难理解如何打印它。

考虑到我处理的是纳秒,什么是最好的技术?如果可能的话,我宁愿坚持使用标准库。

我现在还在使用C++17,但是请注意,如果C++20让这件事更容易做的话,请告诉我。

代码语言:javascript
复制
#include <chrono>
#include <iostream>

using Clock = std::chrono::high_resolution_clock;
using TimePoint = std::chrono::time_point<Clock>;

int main()
{
    const uint64_t nanosSinceEpoch = 1517812763001883383;
    const Clock::duration duration_ns_since_epoch = std::chrono::nanoseconds(nanosSinceEpoch);

    const TimePoint tp(duration_ns_since_epoch);

    // Would like to print tp in readable format
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-17 13:44:01

high_resolution_clock没有一个可移植的时代。可能是1970年。可能是当你的设备启动的时候。因此,在打印其time_point时,可以完成的最佳操作是打印底层持续时间。

system_clock可以表示nanoseconds,即使system_clock::time_point没有。诀窍是使用更通用的time_point形式,即:

代码语言:javascript
复制
template <class Clock, class Duration>
class time_point;

您可以指定时钟和持续时间,例如:

代码语言:javascript
复制
time_point<system_clock, nanoseconds> tp;

我喜欢设置一个模板化的类型别名来完成以下操作:

代码语言:javascript
复制
template <class Duration>
    using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;

现在我可以使用更简单的语法了:

代码语言:javascript
复制
sys_time<nanoseconds> tp;

在C++20中,sys_time<chrono>为您提供。C++20允许您简单地打印出system_clock-based time_points。

不幸的是,我不相信现在还没有人在运送C++20的这一部分。然而,有一个与C++11/14/17一起工作的:

代码语言:javascript
复制
#include "date/date.h"

#include <chrono>
#include <iostream>

int main()
{
    const uint64_t nanosSinceEpoch = 1517812763001883383;

    const std::chrono::nanoseconds d(nanosSinceEpoch);
    using date::operator<<;
    std::cout << date::sys_time<std::chrono::nanoseconds>{d} << '\n';
}

输出:

代码语言:javascript
复制
2018-02-05 06:39:23.001883383

更新以解决时区问题

在头tz.h中的同一个链接上有一个预览库,它处理时区。此库不只是标头库。有一个与它相关的源文件,tz.cpp。这里是编译它的指南。

此库可用于将sys_time (又名Unix时间 / UTC)转换为任何IANA时区

例如,如果您需要在"America/Chicago“中显示上述输出(即使您的计算机不在芝加哥),则可以这样做:

代码语言:javascript
复制
#include "date/tz.h"

#include <chrono>
#include <iostream>

int main()
{
    const uint64_t nanosSinceEpoch = 1517812763001883383;

    using namespace std::chrono;
    date::sys_time<nanoseconds> tp{nanoseconds(nanosSinceEpoch)};
    std::cout << date::zoned_time{"America/Chicago", tp} << '\n';
}

输出:

代码语言:javascript
复制
2018-02-05 00:39:23.001883383 CST

这也是C++20 <chrono>的一部分。zoned_time是一个时区和一个sys_time的配对,只要它是秒或更细,它就具有任何精度。它的流运算符包括时区缩写。还有一个format函数( C++20中的std::format,库中的date::format )可以用来定制输出。例如:

代码语言:javascript
复制
date::zoned_time zt{"America/Chicago", tp};
std::cout << date::format("%F %T%z", zt) << '\n';

输出:

代码语言:javascript
复制
2018-02-05 00:39:23.001883383-0600
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62954221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档