2016-06-07 59 views
1

我有下面的代碼從了posix_timeboost :: posix_time :: time_duration溢出?

boost::posix_time::ptime time1(boost::gregorian::date(9999,12,31)); 
boost::posix_time::ptime epoch(boost::gregorian::date(1970,1,1)); 

boost::posix_time::time_duration diff = time1-epoch; 
cout<<"A: "<<time1<<endl; 
cout<<"B: "<<epoch<<endl; 
cout<<"C: "<<diff<<endl; 

unix_time = diff.total_seconds() 

獲得UNIX時間給我這個輸出

9999-Dec-31 00:00:00 
1970-Jan-01 00:00:00 
-1347834:03:51.933722624 

現在diff不應該是一個負數。我如何計算這個權利?有溢出嗎?

+0

'長long',但'diff'已經是負 – user2071938

+0

這可能是你在找什麼:HTTPS://en.wikipedia .org/wiki/Year_2038_problem – stefaanv

+0

我不能用最初的32位爲unix時間 – user2071938

回答

-1

您可以始終通過從零中減去正值/負值來反轉。

diff = 0 - diff; // if diff was negative it will be positive now. 

編輯1:額外信息;

此外,你的公式time1-epoch將計算2個時間點之間的差異。您應該將差異添加到當前可能導致您喜歡的時間。 (消極的結果是一個邏輯上的差異)。

+0

是的,但我希望unix時間,這是(秒鐘'1970-1-1')。負數並不意味着錯誤的結果,但在這種情況下,'9999-12-31'比1970-1-1更晚,所以如果沒有溢出,我認爲結果應該是正值。 – user2071938

+0

從[WikI Unix時間](https://en.wikipedia.org/wiki/Unix_time):「最大可表示時間是2038-01-19星期二」。你有一個千年蟲;-) – 2016-06-07 07:29:15

+0

我不工作與最初的32位的Unix時間 – user2071938

-1

如果你有C++ 11,或許<chrono>加上這個free open source date library它延伸<chrono>可以幫助嗎?

#include "date.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date::literals; 
    auto time1 = 9999_y/dec/31; 
    auto epoch = 1970_y/jan/1; 
    std::chrono::seconds diff = date::sys_days{time1} - date::sys_days{epoch}; 
    std::cout << "A: " << time1 << '\n'; 
    std::cout << "B: " << epoch << '\n'; 
    std::cout << "C: " << diff.count() << '\n'; 
} 

輸出:

A: 9999-12-31 
B: 1970-01-01 
C: 253402214400 
+0

這個庫可以處理納秒精度嗎? – user2071938

+0

@ user2071938:是,否。 ''有一個名爲'nanoseconds'的類型,存儲在'int64_t'中。這給了它一個+/- 292年的範圍,這個例子的範圍不夠。如果你有128位的類型,你可以創建你自己的納秒類型:'使用納秒= std :: chrono :: duration <__ int128_t,std :: nano>;'。這將有足夠的範圍爲您的例子。 –

+0

在我的系統上'__int128_t'很難處理。例如,你不能將它流出到「cout」。 –

0

(順便說一句 - 我用coliru下面的輸出,和我的本地GCC 5.3.1與提升1.60再生)

的問題是,你想要這個數字在幾秒鐘內,所以讓我們嘗試一些基本的數學(看看我得到它的權利!):)

A: 9999-Dec-31 00:00:00 
B: 1970-Jan-01 00:00:00 
C: 70389504:00:00 

所以,差(E按小時計算)爲70389504小時。其以秒爲:

70389504 * 60 * 60 =>253402214400秒

現在,在圖書館的內部,存在用於sec_type默認爲boost::int32_t一個類型DEF。因此,除非設置爲int64_t,否則上述值將溢出。

至於如何重寫,除非你砍的date_time庫,並改變從boost::int32_ttime_resolution_traits.h的默認boost::int64_。(有可能是另一種方式,它是不可能的,但我沒有詳細研究代碼足以告訴你這將是什麼..)

現在爲您的真正問題,你似乎有這個集-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG - 我懷疑你想要納秒精度?如果是這樣,我認爲你必須減少支持的日期範圍。

+0

thx!是的,我已經設置了'DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG'。是否有機會檢測溢出? – user2071938

+0

Erm,如果設置了標誌,就會破壞庫的設置以將'sec_type'(真的是'var_type')的大小設置爲64位,這是沒辦法的......你可以提交一個錯誤報告,看看是否他們會修復它的下一個版本? – Nim

+0

...或者使用霍華德強調的上面的庫 - 它似乎能夠處理你之後的範圍...... – Nim

0

這在升壓:: DATE_TIME一個已知問題:https://svn.boost.org/trac/boost/ticket/3109

甲TIME_DURATION可以代表比秒升壓的類型:: TIME_DURATION :: total_seconds()可以代表數大的間隔。

如果你需要的總秒數,更好地利用

time_duration td = ... 
auto seconds = td.ticks()/time_duration::ticks_per_seconds(); 
相關問題