将无符号长整型转换为std::chrono::time_point并返回

3

我对某件事情感到非常困惑。背景如下:

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对象?我发现自己正在做一些奇怪的事情(我不想在这里展示),我想问正确的重建方法是什么。


time_since_epoch 会给你从时钟开始算起到现在的时间量,而不是时间点。大多数纪元使用Unix纪元,即1970年1月1日。 - NathanOliver
你希望得到什么结果?是指 tptt 多了 298 毫秒吗? - NathanOliver
是的,@NathanOliver。tptt多了298毫秒。Howard在下面的回答中非常有帮助。 - ForeverLearning
1个回答

3
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);

1
这意味着它不适合序列化和可能的传输吗? - Sebastian
1
如果您知道在使用相同的std::lib/platform读取它时,或者序列化文档记录了单位,或者格式为yyyy-mm-dd hh:mm:ss.fffffff,或者其他自我记录格式,则进行序列化是安全的。 - Howard Hinnant
@HowardHinnant 谢谢Howard!我一直在纠结于如何确定这个数字的分辨率。所以,您是说如果这个数字将在不同的平台/stdlib中重新生成,那么它对于序列化来说是不安全的?有没有其他选择? - ForeverLearning
1
我会补充答案... - Howard Hinnant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接