سؤال

لقد اكتشفت نتيجة غريبة في تعزيز مكتبة وقت التاريخ 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 ، والتي أشك بشدة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top