C++ C++;打印时间::时间点<;时钟:高分辨率时钟>;可读
我有从Epoch开始的纳秒数,我想把它打印出来以便可读 我发现在线打印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
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