2009-07-22 20 views
10

私は、時代の秒からの秒数をptimeに変換する必要があります。私はこれを行う簡単な方法がなければならないことは確かですが、何も見つかりませんでした。ありがとう。unixタイムスタンプをboost :: posix_time :: ptime

編集:元のタイムスタンプは浮動小数点です。私はそれを変更することはできませんし、私は秒未満の精度を失いたくはありません。

+0

本当にダブルが必要ですか?私はintに収まると思う。 – slipbull

+1

はい、私はダブルが必要です - それは私が変更できないインターフェースの一部です。数秒であれば分数部分をキャプチャすることはできません...そして、http://xkcd.com/607/ :-) – cube

答えて

5

一部が周りいじる後、私はこの思い付いた:

ptime(date(1970, 1, 1), time_duration(0, 0, 0, time_duration::ticks_per_second() * 1234567890.0987654321)) 

私はこれが最善の解決策であるわからないんだけど、私が必要なものをやっているようです。マイクロ秒の解像度のデフォルトレベルにコンパイルブースト日付/時間を持っているマシンの場合

8

from_time_t()変換機能を使用してください。 A time_tは、UNIXタイムスタンプ、すなわちエポックからの秒数である。

+1

time_tは秒の小数部分を含むことはできませんが、答えは – cube

+0

'ほとんどすべてのプラットフォームでUNIXタイムスタンプですが、C++標準ではこの動作が指定されていません。だからこの翻訳には注意してください。 –

7

、これを試してみてください。

double ts = 1250524800.5; 
// Use floor() here if seconds are always positive. 
time_t secondsSinceEpoch = floor(ts); 
long microsecondsSinceSecond = 
    floor((ts - static_cast<double>(secondsSinceEpoch)) * 1000000); 
boost::posix_time::ptime result = 
    boost::posix_time::from_time_t(secondsSinceEpoch); 
boost::posix_time::time_duration fractionalSeconds(0, 0, 0, 
                microsecondsSinceSecond); 
result += fractionalSeconds; 
cout << "Time stamp is " << result << endl; 

このため、出力「タイムスタンプは、2009 - 月 - 17 16:00です。 00.500000 "と表示されます。

+2

最も近い丸めを得るには、 'microsecondsSinceSecond'計算に' + 0.5'を追加します。さもなければ、切り詰めのバグに悩まされます。でも、おそらく...マイクロ秒の半分の違いを気にしている人なら、おそらく最初に「ダブル」にタイムスタンプを保存しないだろうと思います。 – Tom

+0

@Tom:ここで正しいと思いますが、このレベルの解像度に本当に関心を持つ人なら誰でも、Boostディストリビューションにナノ秒のサポートを設定し、上記のコードを適切に変更することが期待されます。 –

+0

+1分数秒間を要する素晴らしいコードスニペット。 –

関連する問題