[英]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;
我得到 output:
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 位 integer 存儲(沒有溢出)。 因此time > exp == 1
是正確的( time
是1590775919s
轉換為system_clock
的精度)。
4 月 26 日星期六 01:39:43 4758 對應於 87990716383 的time_t
。
我認為您在上述代碼中使用chrono
庫沒有任何問題。
更新
使用
from_time_t()
將值 87990716383 轉換為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
以帶符號的 64 位 integer 存儲自 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.