C++ C++;打印时间::时间点<;时钟:高分辨率时钟>;可读

C++ C++;打印时间::时间点<;时钟:高分辨率时钟>;可读,c++,chrono,C++,Chrono,我有从Epoch开始的纳秒数,我想把它打印出来以便可读 我发现在线打印time\u point的例子是使用system\u clock,然后转换成std::time\u t。然而,我使用的是高分辨率时钟(因为纳秒),因此我很难理解如何打印它 考虑到我处理的是纳秒,最好的技术是什么?如果可能的话,我更愿意使用标准库 我现在仍然坚持使用C++17,但是请务必提及C++20是否使这更容易实现 #include <chrono> #include <iostream> usin

我有从Epoch开始的纳秒数,我想把它打印出来以便可读

我发现在线打印
time\u point
的例子是使用
system\u clock
,然后转换成
std::time\u t
。然而,我使用的是
高分辨率时钟
(因为纳秒),因此我很难理解如何打印它

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

我现在仍然坚持使用C++17,但是请务必提及C++20是否使这更容易实现

#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
}
#包括
#包括
使用时钟=标准::时钟::高分辨率时钟;
使用TimePoint=std::chrono::time\u point;
int main()
{
const uint64_t nanosincepoch=1517812763001883383;
常数时钟::持续时间从新纪元开始的持续时间=std::时钟::纳秒(纳秒新纪元);
常数时间点tp(自新纪元起的持续时间);
//要以可读格式打印tp吗
}

高分辨率时钟
没有便携式历元。可能是1970年。可能是在设备启动时。因此,在打印其
时间点时,最好是打印基本的持续时间

系统时钟
可以表示
纳秒
,即使
系统时钟::时间点
不表示。诀窍是使用更通用的
时间点形式,即:

template <class Clock, class Duration>
class time_point;
输出:

2018-02-05 06:39:23.001883383
2018-02-05 00:39:23.001883383 CST
2018-02-05 00:39:23.001883383-0600
更新以解决时区问题 报头tz.h中有一个at-the-the-the-link,它处理时区。此库不仅仅是标题。有一个与之关联的源文件,tz.cpp

此库可用于将
sys\u time
(aka/UTC)转换为任何时间

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

#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';
}
这也是C++20
的一部分
zoned_time
是时区和
sys_time
的配对,只要精度为秒或更高。其流媒体运营商包括时区缩写。还有一个
format
函数(C++20中的
std::format
,库中的
date::format
)可用于自定义输出。例如:

time_point<system_clock, nanoseconds> tp;
date::zoned_time zt{"America/Chicago", tp};
std::cout << date::format("%F %T%z", zt) << '\n';

related/dupe:@NathanOliver该示例正在使用system_clock,这导致从chrono:创建时出现编译错误:nanoseconds@user997112但被接受的答案以转换为
std::time\t
结束,后者更便于打印,并提到了打印此类结构的常用方法。@Yksisarvinen我完全同意,我想使用这种方法,但我不确定如何从高分辨率时钟创建时间?啊,对了,功能
到时间
只存在于
系统时钟中,我的错。虽然直接使用
高分辨率时钟
似乎是不被鼓励的(或者至少cppreference不鼓励这样做)。谢谢你,霍华德。我会试试看。谢谢你把这个输入到C++20中。在C++中有太多的琐碎任务,它们是5-10行。这是其中之一。很遗憾,获取编译器错误日期。h:1066:23:error:“未捕获的异常”已被弃用!std::uncaught_exception()&&有两种方法可以处理此问题:1)不要将警告转换为错误。或者2)在包含date.h之前定义
有未捕获的异常=1
。有一种方法可以做到这一点,我将更新我的答案以解决它。但首先,你能更具体地说明你的目标时区吗?CET是几个时区的缩写。也许是“欧洲/柏林”?没问题。更新我的答案,使用“美国/芝加哥”。
2018-02-05 00:39:23.001883383 CST
date::zoned_time zt{"America/Chicago", tp};
std::cout << date::format("%F %T%z", zt) << '\n';
2018-02-05 00:39:23.001883383-0600