2010-12-15 9 views
5

私はdate_timeを使用してプラットフォームの特質を抽象化しています。シリアル化で使用される64ビットのマイクロ秒の解像度uint64_tを生成する必要があります。私は下に何が間違っているのか分かりません。boost :: date_time(boost-145)64ビットuintとマイクロ秒の計算を切り捨てなし

#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/cstdint.hpp> 
#include <iostream> 

using namespace boost::posix_time; 
using boost::uint64_t; 

ptime UNIX_EPOCH(boost::gregorian::date(1970,1,1)); 

int main() { 
    ptime current_time = microsec_clock::universal_time(); 

    std::cout << "original time: "<< current_time << std::endl; 

    long microsec_since_epoch = ((current_time -UNIX_EPOCH).total_microseconds()); 

    ptime output_ptime = UNIX_EPOCH + microseconds(microsec_since_epoch); 
     std::cout << "Deserialized time : " << output_ptime << std::endl; 

    std::cout << "Microsecond output: " << microsec_since_epoch << std::endl; 

    std::cout << "Microsecond to second arithmetic: " 
     << microsec_since_epoch/(10*10*10*10*10*10) << std::endl; 

    std::cout << "Microsecond to tiume_duration, back to microsecond : " << 
     microseconds(microsec_since_epoch).total_microseconds() << std::endl; 


    return 0; 
} 

ここに私が得られる出力があります。

original time: 2010-Dec-17 09:52:06.737123 
Deserialized time : 1970-Jan-16 03:10:41.577454 
Microsecond output: 1292579526737123 
Microsecond to second arithmetic: 1292579526 
Microsecond to tiume_duration, back to microsecond : 1307441577454 

Iはtotal_seconds()と+ seconds(..)問題消える--i.eの使用に切り替え、入力の変化に:

2010-Dec-15 18:26:22.606978 
2010-Dec-15 18:26:22 

DATE_TIMEは、64ビットの内部入力を使用すると主張し、2^64÷ (10^6×3600×24×365) ~= 5849422^60÷ (10^6×3600×24×365) ~= 36558。ウィキペディアから

開封線

Unixの時間、またはPOSIX時間のPosix時間について言うためにこれを持っている、システム が時間内のポイントを説明するためのものである、 真夜中からの経過秒数として 定義ユニバーサル協定世界時の協定 (UTC)

なぜこのような大量切り捨てが40年後に行なわれているのですか?

boost :: date_timeを使用して、マイクロ秒の解像度で完全な64ビットスペースを使用するにはどうすればよいですか?

ポストをhans--に応答して

--edit1はduration.total_microseconds()部分の整数出力を反映するように変更されています。注1292576572566904÷(10^6×3600×24×365)〜= 40.98年。秒からの出力は更新されていません。

--edit2-- 「デシリアライゼーション」ステップの前にマイクロ秒を秒にダウンスケーリングすると、うまく機能します。このアプローチは私の問題を解決しました。私は作成時にマイクロ秒の解像度しか必要としません。

私はまだ何が問題の原因を知りたいですか?

+0

64ビットマイクロ秒の解決時間を使用するものも作成していますので、私も不思議です。 – Omnifarious

答えて

2

これは、このような大きなマイクロ秒の入力を処理できないmicroseconds()に問題があるようです。この問題の修正は次のとおりです。

#define MICROSEC 1000000 

uint64_t sec_epoch = microsec_since_epoch/MICROSEC; 
uint64_t mod_micro_epoch= microsec_since_epoch % MICROSEC; 

ptime new_method = UNIX_EPOCH + seconds(sec_epoch) + microseconds(mod_micro_epoch); 

std::cout << "Deserialization with new method: " << new_method << std::endl; 
1

total_microseconds()の戻り値の型は、tick_typeではありません。 32ビットのlong型のコンパイラでこれをコンパイルしているようです。マイクロ秒の価値を40年間保存するには、多少になります。

+0

64ビットサーバubuntu:/。 total_microseconds()から出てくる整数をplussします。実際には正しいです。 40.98年分のマイクロ秒。上記のプログラムを変更して、私が仕事に入るときにこれを説明します。エポック+マイクロ秒の部分で切り捨てられると私は驚くことはありません。 –

+0

total_microsecondsから何が出ているかを示すために私の投稿を更新しました。 –

関連する問題