c ++ chrono给出负纪元时间

Posted

技术标签:

【中文标题】c ++ chrono给出负纪元时间【英文标题】:c++ chrono giving negative epoch time 【发布时间】:2015-06-08 18:52:03 【问题描述】:

我正在使用此代码获取自纪元以来的当前时间(以毫秒为单位)

std::chrono::milliseconds ms = std::chrono::duration_cast< std::chrono::milliseconds >(
    std::chrono::high_resolution_clock::now().time_since_epoch()
    );
long currTime = (long)ms.count();

问题是我现在得到一个负数,每次调用它都会给我一个接近 0 的负数。它已经工作了好几个星期,几个小时前就开始工作了。我认为我没有做任何应该影响它的事情,但这是可能的。

这是我得到的几个示例数字:

First time: -2145295742
Second time: -2145279907
Third time: -2145268209
Last time: -2144900213

我的计算机时钟时间是正确的日期,为什么我会在这里得到负数?

【问题讨论】:

为我工作; std::cout &lt;&lt; ms.count(); 给出积极的结果。你如何显示持续时间?它看起来像是某种溢出,尽管标准保证整数类型 en.cppreference.com/w/cpp/chrono/duration 至少有 45 位 您没有显示转换它并丢失数据的代码部分。 1428079769000 是一个很大的数字。事实上,超过 2³²。 我正在调试,看看结果如何。突然间,我的程序开始出现异常。就像我说的那样,过去几周对我来说它工作得很好,甚至几个小时前。现在它在调试或发布中不起作用。我已经将版本放在另一台机器上(我注意到有问题的地方)并且它在那里做同样的事情 @chris 至少有 45 位毫秒,所以可能编译器使用的是 64 位类型。 @vsoftco,是的,从图书馆出来肯定没问题。 【参考方案1】:

您的代码中的long 溢出:

long currTime = (long)ms.count();

最好的办法是确保您的数据类型有足够的“位”来表示持续时间。我愿意

auto currTime = ms.count();

或者,确保您使用至少 45 位的类型(因为这保证是 milliseconds 中整数类型的 minimum size)。我发现在这种情况下auto 非常有用,因为您的代码将是可移植的,并且currTime 始终使用正确的类型,无论编译器/平台如何。

【讨论】:

以上是关于c ++ chrono给出负纪元时间的主要内容,如果未能解决你的问题,请参考以下文章

如何找到纪元时间戳和 std::chrono::system_clock::now 之间的时间差(以毫秒为单位)

C++ chrono 系统时间(以毫秒为单位),时间操作

std chrono 时间同步

如何在 python 中将 1970 年前的日期转换为纪元? [复制]

获取 POSIX 纪元作为 system_clock::time_point

使用 c++ 将纪元毫秒转换为 UTC 日期和时间