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 的精度)。
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