Вопрос

Я обнаружил странный результат в библиотеке даты и времени Boost C ++.Существует несоответствие между microsec_clock и second_clock, и я не понимаю, почему это так.Я использую 32-разрядную версию Windows XP

Мой фрагмент кода:

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;
...

Распечатка, которую я ожидал, - это текущее время без миллисекунд и с миллисекундами.Однако то, что у меня есть на моем компьютере, это:

2009-10-14T16:07:38  
1970-06-24T20:36:09.375890

Я не понимаю, почему в моем файле указана дата выхода в эфир (1970 год???) microsec_clock время.Сопутствующая документация для Boost: ссылка для увеличения даты и времени

Это было полезно?

Решение

Не уверен, что с вами может быть не так;точно такой же код работает и у меня.

$ кошка > test.cc
#включить <boost date_time="" gregorian="" gregorian.hpp="">
#включить <boost date_time="" posix_time="" posix_time.hpp="">
используя расширение пространства имен::posix_time;int main() { 
 ptime now = second_clock::universal_time();ЗППП::cout << "Текущее время - это:"<< to_iso_extended_string(сейчас)<< std::endl;ptime now_2 = микросекундные часы::universal_time();ЗППП::cout << "Текущее время - это:"<< to_iso_extended_string(теперь_2)<< std::endl;возвращает 0;}
^D
$ c ++ -lboost_date_time test.cc
$ ./a.выйти
Current Time is: 2009-10-14T16:26:55
Current Time is: 2009-10-14T16:26:55.586295

С точки зрения реализации, second_clock использование time и microsec_clock использование gettimeofday или GetSystemTimeAsFileTime снизу, в зависимости от платформы.Кажется, что-то не так с вашей платформой - какая у вас операционная система и версия?


Какая у вас версия Boost?Если оно равно 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 отличается от времени UNIX смещением, и код, который раньше был в Boost, не будет генерировать правильную разницу смещений в некоторых оптимизирующих компиляторах.

Другие советы

Дата 1970 года, скорее всего, происходит от того, как время Unix представлено в секундах с 1 января 1970 года.Я предполагаю, что, возможно, каким-то образом он получает время безотказной работы системы в миллисекундах и интерпретирует его как секунды с 1 января 1970 года.Время безотказной работы чуть более 4 часов соответствует этой дате.

В отличие от second_clock, microsec_clock::universal_time в документации упоминается: Возвращает время UTC на основе настройки компьютера.
Вам следует проверить настройки аппаратных часов (или откуда microsec получает свои значения).

редактировать:
Если это не связано с настройками вашего компьютера, это должно быть неправильное поведение при повышении, в чем я очень сомневаюсь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top