Повысьте C ++ date_time до микросекунды и second_clock
Вопрос
Я обнаружил странный результат в библиотеке даты и времени 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 получает свои значения).
редактировать:
Если это не связано с настройками вашего компьютера, это должно быть неправильное поведение при повышении, в чем я очень сомневаюсь.