Boost C ++ Date_time microsec_clock و second_clock
سؤال
لقد اكتشفت نتيجة غريبة في تعزيز مكتبة وقت التاريخ 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;
...
المطبوعة التي كنت أتوقعها هي الوقت الحالي بدون ميلي ثانية ومع Milliseonds. ومع ذلك ، ما لدي في جهاز الكمبيوتر الخاص بي هو:
2009-10-14T16:07:38 1970-06-24T20:36:09.375890
لا أفهم لماذا يوجد تاريخ في السنة (عام 1970 ؟؟؟) في بلدي microsec_clock
الوقت. الوثائق ذات الصلة لتعزيز: رابط لتعزيز وقت التاريخ
المحلول
لست متأكدًا مما قد يكون خطأ بالنسبة لك ؛ نفس الرمز بالضبط يعمل بالنسبة لي.
$ Cat> 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 (الآن) << 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 Current Time is: 2009-10-14T16:26:55 Current Time is: 2009-10-14T16:26:55.586295
التنفيذ ، second_clock
الاستخدامات time
و microsec_clock
الاستخدامات gettimeofday
أو GetSystemTimeAsFileTime
أسفل ، اعتمادا على المنصة. يبدو أن هناك خطأ ما في النظام الأساسي الخاص بك - ما هو نظام التشغيل والنسخ الخاص بك؟
ما هو نسخة التعزيز الخاصة بك؟ إذا كان 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 على إزاحة مختلفة من Time Unix ، والرمز الذي كان في Boost من قبل لن يولد فرق الإزاحة الصحيح في بعض المجمعين تحسين.
نصائح أخرى
تاريخ 1970 على الأرجح يأتي من الطريق unix الوقت يتم تمثيله ، على سبيل المثال من 1 يناير 1970. أعتقد أنه ربما يكون ذلك بطريقة ما الحصول على وقت التشغيل في النظام بالمللي ثانية وتفسيره على أنه ثوانٍ منذ 1/1/1970. سيأتي هذا التاريخ بعد ما يزيد قليلاً عن 4 ساعات.
على عكس second_clock
, ، ال microsec_clock::universal_time
يذكر الوثائق: يعيد وقت UTC بناءً على إعدادات الكمبيوتر.
يجب عليك التحقق من إعدادات ساعة الأجهزة الخاصة بك (أو في أي مكان يحصل فيه Microsec على قيمه).
تعديل:
إذا لم تكن مرتبطة بإعدادات أجهزة الكمبيوتر الخاصة بك ، فيجب أن تكون سوء سلوك في Boost ، والتي أشك بشدة.