2009-10-14 2 views
6

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

Мой надрез код:

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 

Я не понимаю, почему есть weired дата (1970 год ???) в моем microsec_clock времени. Сопутствующая документация для Форсирования: link to boost date time

ответ

5

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

 
$ cat > test.cc 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
using namespace boost::posix_time; 
int main() { 
    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; 
    return 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; 

Окна FileTime имеет разное смещение от UNIX времени, и код, который находился в Boost, до этого не будет генерировать правильное значение смещения в некоторых оптимизирующих компиляторов.

+0

Я использую систему Win32, Windows XP SP2 32 бита, если быть точным. – Lily

+0

Я использую 1.39 уже с Eclipse 3.4.1 и MingW 3.4. Кроме того, я имею предупреждение: Описание \t \t Resource Path \t \t Расположение Тип C: /boost/boost_1_39/boost/date_time/filetime_functions.hpp влево величина сдвига> = ширина типа \t CommercialDetection линии 101 \t C/C++ Проблема, как хорошо – Lily

+0

Хм, я думал, что это исправление было в 1,39, но я могу проверить. – ephemient

1

1970 даты, скорее всего, происходит от того, unix time представлен, в секундах с 1 января 1970 года я предположил бы, что может быть, это как-то получать безотказную работу системы в миллисекундах и его интерпретация в секундах с 1/1/1970. С этой датой пришло время простоя чуть более 4 часов.

1

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

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

+0

Очень хорошая точка, и я также нашел это: Получите время UTC, используя часы второй секунды. В Unix-системах это реализовано с использованием GetTimeOfDay. На большинстве платформ Win32 реализовано с использованием ftime. Благодаря этим API системам Win32 часто не достигается разрешение микросекунды. Если более высокое разрешение имеет решающее значение для вашего приложения, проверьте свою платформу, чтобы увидеть достигнутое разрешение. ===> Я использую систему Win32, поэтому, возможно, такого разрешения вообще нет в моем компьютере. Это может быть причиной. Тем не менее, распечатка дала мне дату, а затем откуда эти цифры? ... – Lily

+0

Реализованно она генерирует time_type с текущей даты и ftime() в create_time(), если я вижу это правильно. –

+0

И если ftime() не поддерживает вспомогательное второе разрешение, я бы ожидал потерять высокое разрешение и резервное копирование до следующего наилучшего разрешения. –

Смежные вопросы