比较两个std::chono::time_point实例时出错。

问题描述 投票:0回答:1

我有两个std::chrono::time_point实例,在变量 exptime. exp 有时间在未来和 time 是当前时间。但是,当我比较它们,如在这个片段中。

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年。

我到底错在哪里?

c++ datetime c++11 std chrono
1个回答
0
投票

t_exp-4243023785

该值为 time_t 对应于1835-07-18 22:16:55 (假设Unix的纪元和秒的精度,这两个标准都没有规定,但很常见)。

很明显的是 ctime 在你的平台上不能处理这么久远的日期,这有点令人惊讶,因为1835年并不是很远的过去。

价值的 exp-4243023785 百万倍或十亿倍(取决于对 system_clock 在您的平台上),并以一个带符号的64位整数存储(没有溢出)。 因此 time > exp == 1 是正确的(time1590775919s 换算成精度为 system_clock).

Sat Apr 26 01:39:43 4758对应的是一个 time_t 的87990716383。

我觉得你使用的""没有错。chrono 的库。

更新

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

啊,这结合了在你的平台上的精准度的知识。system_clocknanoseconds 告诉我,你在建设上遇到了溢出的问题 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 店铺 nanoseconds 自1970-01-01 00:00:00UTC以来,以64位带符号的整数表示。 最大可存储日期(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
© www.soinside.com 2019 - 2024. All rights reserved.