私は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) ~= 584942
も2^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-- 「デシリアライゼーション」ステップの前にマイクロ秒を秒にダウンスケーリングすると、うまく機能します。このアプローチは私の問題を解決しました。私は作成時にマイクロ秒の解像度しか必要としません。
私はまだ何が問題の原因を知りたいですか?
64ビットマイクロ秒の解決時間を使用するものも作成していますので、私も不思議です。 – Omnifarious