比较两个 std::chrono::time_point 实例时出错
Error in comparing two std::chrono::time_point instances
我在变量exp
和time
中有两个 std::chrono::time_point 实例。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
乘以 100 万或 10 亿(取决于平台上system_clock
精度(,并使用有符号的 64 位整数存储(没有溢出(。 因此time > exp == 1
是正确的(time
1590775919s
转换为system_clock
的精度(。
4 月 26 日星期六 01:39:43 4758 对应于87990716383的time_t
。
我认为您在上面的代码中使用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
以有符号 64 位整数存储自 1970-01-01 00:00:00 UTC 以来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
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 解析某些行的文本和输出"time of appearance"
- Qt5 部署"procedure entry point could not be located"
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 如何从内存中分配GDI+ POINT类地址?
- 返回time()库函数的数据类型
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 如何在OpenCV中存储部分轮廓点喜欢新矢量中的左侧,该类型为<vector<vector<Point>>
- 在每个向量<向量中查找最小/最大 x,y<Point>>
- 如何从 boost::p osix_time::p time 获取秒数
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- "Entry Point Not Found" Azure 中的错误 LightGBM R 包
- C++ SRAND(time(0)) 在猜谜游戏中不起作用
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- struct TM time;vs TM time = {}.输出相同但不相同?
- 使用 Windows 寄存器查找下一个"Daylight Saving Time"
- c++ get millsecond time
- "Feature X requires run-time support"的含义是什么?
- 如何传递以 "size determined at run time" 作为引用的动态分配数组?