【问题标题】:Error in comparing two std::chrono::time_point instances比较两个 std::chrono::time_point 实例时出错
【发布时间】:2020-05-29 12:51:52
【问题描述】:

我在变量exptime 中有两个std::chrono::time_point 实例。 exp 有未来的时间,time 是当前时间。但是当我在这个 sn-p 中比较它们时:

std::time_t t_exp = std::chrono::system_clock::to_time_t(exp);
std::time_t t_time = std::chrono::system_clock::to_time_t(time);
std::cout << std::ctime(&t_exp) << std::ctime(&t_time) << (time > exp) << std::endl;

我得到输出:

Sat Apr 26 01:39:43 4758
Fri May 29 18:11:59 2020
1

这是错误的,因为 exp 是 4758 年,time 是 2020 年。

我哪里出错了?

【问题讨论】:

  • t_exp的值是多少?
  • @HowardHinnant 这是-4243023785

标签: c++ datetime c++11 std chrono


【解决方案1】:

t_exp-4243023785

time_t 的值对应于 1835-07-18 22:16:55(假设 Unix 纪元和精度为秒,标准均未指定,但很常见)。

显然,在您的平台上实现 ctime 无法处理这么远的日期,这有点令人惊讶,因为 1835 距离过去并不远。

exp 的值是-4243023785 乘以一百万或十亿(取决于您的平台上system_clock 的精度),并以带符号的 64 位整数存储(没有溢出)。因此time &gt; exp == 1 是正确的(time1590775919s 转换为system_clock 的精度)。

4 月 26 日星期六 01:39:43 4758 对应于 87990716383 的 time_t

我认为您在上述代码中使用 chrono 库没有任何问题。

更新

值 87990716383 正在使用 from_time_t() 转换为 time_point

啊,这与知道在您的平台上 system_clock 的精度为 nanoseconds 的知识相结合,告诉我您在构造 exp 时遇到溢出。

这不是你的代码:

std::time_t t_exp = std::chrono::system_clock::to_time_t(exp);
std::time_t t_time = std::chrono::system_clock::to_time_t(time);
std::cout << std::ctime(&t_exp) << std::ctime(&t_time) << (time > exp) << std::endl;

您的代码如下所示:

// ...
std::time_t t_exp = 87990716383;
auto exp = std::chrono::system_clock::from_time_t(t_exp);
std::cout << std::ctime(&t_exp) << std::ctime(&t_time) << (time > exp) << std::endl;

在您的平台上,system_clock 自 1970-01-01 00:00:00 UTC 以有符号 64 位整数存储 nanoseconds。您平台上的最大可存储日期 (system_clock::time_point::max()) 为:

2262-04-11 23:47:16.854775807

除此之外,nanoseconds 的底层存储溢出。

当 87990716383(秒)转换为 from_time_t 时,它乘以溢出的十亿。溢出的值为 -4243003985547758080,对应于日期 1835-07-19 03:46:54.452241920。

您可以通过使用更粗略的精度来获得更大的范围,例如:

std::time_t t_exp = 87990716383;
time_point<system_clock, microseconds> exp{seconds{t_exp}};
// exp == 4758-04-26 01:39:43.000000

【讨论】:

  • 我希望 chrono 将时间解释为未来的时间。值 87990716383 正在使用 from_time_t() 转换为 time_point,然后与当前的 time_point 进行比较。有没有办法让它正确比较。
  • 这两个值是什么:exp.time_since_epoch().count()time.time_since_epoch().count()
  • -4243023785547758080, 1590846692178289970 分别。
  • 所有time &gt; exp 正在做的是返回1590846692178289970 &gt; -4243023785547758080
猜你喜欢
  • 2014-04-13
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
相关资源
最近更新 更多