C++ の date_time microsec_ Clock と Second_Clock をブーストする
質問
Boost C++ 日時ライブラリで奇妙な結果を発見しました。間に矛盾があります microsec_clock
そして second_clock
, 、それはなぜなのかわかりません。Windows XP 32 ビットを使用しています
私のコードの一部:
using namespace boost::posix_time;
...
ptime now = second_clock::universal_time();
std::cout << "Current Time is: "<< to_iso_extended_string(now)<< std::endl;
ptime now_2 = microsec_clock::universal_time();
std::cout << "Current Time is: "<< to_iso_extended_string(now_2)<< std::endl;
...
私が期待していた出力は、ミリ秒を含まない現在時刻とミリ秒を含む現在の時刻です。ただし、私のPCにあるものは次のとおりです。
2009-10-14T16:07:38 1970-06-24T20:36:09.375890
なぜ私のファイルに奇妙な日付(1970年??)があるのかわかりません。 microsec_clock
時間。Boost の関連ドキュメント: 日時をブーストするリンク
解決
あなたにとって何が問題なのかわかりません。まったく同じコードが私にも機能します。
$ 猫 > test.cc #含むu003Cboost/date_time/gregorian/gregorian.hpp>#含むu003Cboost/date_time/posix_time/posix_time.hpp>名前空間boost :: posix_timeを使用しています。int main(){ptime now = second_clock :: universal_time();std::cout << "現在の時刻:"<< to_iso_extended_string(now)<< std::endl;ptime now_2 = microsec_lock::universal_time();std::cout << "現在の時刻:"<< to_iso_extended_string(now_2)<< std::endl;0を返します。} ^D $ c++ -lboost_date_time テスト.cc $ ./a.out Current Time is: 2009-10-14T16:26:55 Current Time is: 2009-10-14T16:26:55.586295
実装に関しては、 second_clock
用途 time
そして microsec_clock
用途 gettimeofday
または GetSystemTimeAsFileTime
プラットフォームに応じて、その下にあります。プラットフォームに問題があるようです。OS とバージョンは何ですか?
ブーストのバージョンは何ですか?1.38 以下の場合は、1.39 にアップグレードするか、修正を適用してください。 #2809 手動で。
--- boost/date_time/filetime_functions.hpp (revision 53621) +++ boost/date_time/filetime_functions.hpp (revision 53622) @@ -96,9 +96,7 @@ { /* shift is difference between 1970-Jan-01 & 1601-Jan-01 * in 100-nanosecond intervals */ - const uint64_t c1 = 27111902UL; - const uint64_t c2 = 3577643008UL; // issues warning without 'UL' - const uint64_t shift = (c1 << 32) + c2; + const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008 union { FileTimeT as_file_time;
Windows FileTime には UNIX 時間とは異なるオフセットがあり、以前 Boost にあったコードは、特定の最適化コンパイラでは正しいオフセットの差を生成しませんでした。
他のヒント
1970年の日付が最も可能性の高い方法から来ているからの秒として、表現されのUNIXタイム1970年1月1日、私は多分それは何とかミリ秒単位でシステムの稼働時間を取得し、1970年1月1日からの秒として解釈されていることを推測します。 4時間強の稼働時間は、この日付を思い付くでしょう。
とは異なり second_clock
, は、 microsec_clock::universal_time
文書て記述: を返しますUTC時間に基づく コンピュータの設定.
を確認しておきましょうハードウェアマットした場合には、以microsec取得し、その値)。
編集:
場合はその関係のないコンピュータを設定すべきだと思います、misbehaviourブーストは、私のことだろう。