我有两个std::chrono::time_point实例,在变量 exp
和 time
. 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年。
我到底错在哪里?
t_exp
是-4243023785
该值为 time_t
对应于1835-07-18 22:16:55 (假设Unix的纪元和秒的精度,这两个标准都没有规定,但很常见)。
很明显的是 ctime
在你的平台上不能处理这么久远的日期,这有点令人惊讶,因为1835年并不是很远的过去。
价值的 exp
是 -4243023785
百万倍或十亿倍(取决于对 system_clock
在您的平台上),并以一个带符号的64位整数存储(没有溢出)。 因此 time > exp == 1
是正确的(time
是 1590775919s
换算成精度为 system_clock
).
Sat Apr 26 01:39:43 4758对应的是一个 time_t
的87990716383。
我觉得你使用的""没有错。chrono
的库。
更新
值87990716383正在转换为一个
time_point
使用from_time_t()
啊,这结合了在你的平台上的精准度的知识。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
店铺 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