6

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。ブーストの関連ドキュメント:ブースト日時へのリンク

4

3 に答える 3

5

何が問題なのかわかりません。まったく同じコードが機能します。

$ cat > test.cc 
#include <boost/date_time/gregorian/gregorian.hpp>
#include <boost/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_clock::universal_time();
    std::cout << "現在の時刻: "<< to_iso_extended_string(now_2)<< std::endl;
    0 を返します。
}
^D
$ c++ -lboost_date_time test.cc 
$ ./a.out
現在の時刻: 2009-10-14T16:26:55
現在の時刻: 2009-10-14T16:26:55.586295

実装に関しては、プラットフォームに応じて、second_clock用途timemicrosec_clock用途gettimeofdayまたはその下。GetSystemTimeAsFileTimeプラットフォームに問題があるようです -- お使いの OS とバージョンは何ですか?


Boost のバージョンは?1.38 以下の場合は、1.39 にアップグレードするか、#2809の修正を手動で適用してください。

--- boost/date_time/filetime_functions.hpp (リビジョン 53621)
+++ boost/date_time/filetime_functions.hpp (リビジョン 53622)
@@ -96,9 +96,7 @@
     {
         /* シフトは 1970-Jan-01 と 1601-Jan-01 の差です
         * 100 ナノ秒間隔で */
- const uint64_t c1 = 27111902UL;
- const uint64_t c2 = 3577643008UL; // 'UL' なしで警告を出す
- const uint64_t shift = (c1 << 32) + c2;
+ const uint64_t shift = 116444736000000000ULL; // (27111902 << 32) + 3577643008

         組合{
             FileTimeT as_file_time;

Windows FileTime には UNIX 時間とは異なるオフセットがあり、以前は Boost にあったコードは、特定の最適化コンパイラで正しいオフセット差を生成しませんでした。

于 2009-10-14T16:44:57.760 に答える
1

1970年の日付は、 UNIX時間が1970年1月1日からの秒数として表される方法に由来する可能性があります。おそらく、システムの稼働時間をミリ秒単位で取得し、1970年1月1日以降の秒数として解釈していると思います。この日付は、4時間強の稼働時間で発生します。

于 2009-10-14T16:36:57.277 に答える
1

とは異なりsecond_clockmicrosec_clock::universal_timeドキュメントには次のように記載されています。コンピューターの設定に基づいて UTC 時刻を返します。
ハードウェア クロックの設定を確認する必要があります (または、microsec の値を取得する場所)。

編集:
コンピューターの設定に関連していない場合、ブーストの誤動作である必要がありますが、これは非常に疑わしいです。

于 2009-10-14T16:41:47.720 に答える