我有自Epoch以来的纳秒数,我想打印这个以便于阅读。
我发现的在线打印time_point的例子是使用system_clock,然后转换成std::time_t。然而,我使用的是high_resolution_clock (因为纳秒),因此我很难理解如何打印它。
考虑到我处理的是纳秒,什么是最好的技术?如果可能的话,我宁愿坚持使用标准库。
我现在还在使用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
}发布于 2020-07-17 13:44:01
high_resolution_clock没有一个可移植的时代。可能是1970年。可能是当你的设备启动的时候。因此,在打印其time_point时,可以完成的最佳操作是打印底层持续时间。
system_clock可以表示nanoseconds,即使system_clock::time_point没有。诀窍是使用更通用的time_point形式,即:
template <class Clock, class Duration>
class time_point;您可以指定时钟和持续时间,例如:
time_point<system_clock, nanoseconds> tp;我喜欢设置一个模板化的类型别名来完成以下操作:
template <class Duration>
using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;现在我可以使用更简单的语法了:
sys_time<nanoseconds> tp;在C++20中,sys_time由<chrono>为您提供。C++20允许您简单地打印出system_clock-based time_points。
不幸的是,我不相信现在还没有人在运送C++20的这一部分。然而,有一个与C++11/14/17一起工作的:
#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';
}输出:
2018-02-05 06:39:23.001883383更新以解决时区问题
在头tz.h中的同一个链接上有一个预览库,它处理时区。此库不只是标头库。有一个与它相关的源文件,tz.cpp。这里是编译它的指南。
此库可用于将sys_time (又名Unix时间 / UTC)转换为任何IANA时区。
例如,如果您需要在"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';
}输出:
2018-02-05 00:39:23.001883383 CST这也是C++20 <chrono>的一部分。zoned_time是一个时区和一个sys_time的配对,只要它是秒或更细,它就具有任何精度。它的流运算符包括时区缩写。还有一个format函数( C++20中的std::format,库中的date::format )可以用来定制输出。例如:
date::zoned_time zt{"America/Chicago", tp};
std::cout << date::format("%F %T%z", zt) << '\n';输出:
2018-02-05 00:39:23.001883383-0600https://stackoverflow.com/questions/62954221
复制相似问题