unsigned long long 到 std::chrono::time_point 并返回

unsigned long long to std::chrono::time_point and back

我对某件事感到很困惑。鉴于:

std::time_t tt = std::time(0);
std::chrono::system_clock::time_point tp{seconds{tt} + millseconds{298}};
std::cout << tp.time_since_epoch().count();

打印类似:16466745672980000(例如)

如何将该数字重新水化为 time_point 对象?我发现自己在做一些古怪的事情(我不想在这里展示),我想问一下正确的补液方法是什么。

system_clock::time_point tp{system_clock::duration{16466745672980000}};

system_clock::duration的单位因平台而异。在您的平台上,我猜它是 1/10 一微秒。

出于序列化目的,您可以记录这是 1/10 微秒的计数。这可以通过以下方式轻松读回:

long long i;
in >> i;
using D = std::chrono::duration<long long, std::ratio<1, 10'000'000>>;
std::chrono::time_point<std::chrono::system_clock, D> tp{D{i}};

如果本机 system_clock::time_point 的精度与 D 一样好或更好,您可以隐式转换为它:

system_clock::time_point tp2 = tp;

否则,您可以选择向上舍入、向下舍入、最接近舍入或向零舍入来截断它。例如:

system_clock::time_point tp2 = round<system_clock::duration>(tp);