簡體   English   中英

比較兩個 std::chrono::time_point 實例時出錯

[英]Error in comparing two std::chrono::time_point instances

我在變量exptime中有兩個 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是正確的( time1590775919s轉換為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM