Следуя здесь а>
Я пытаюсь увидеть, являются ли мои данные 120-секундными или нет, глядя на метку времени данных, поэтому у меня есть небольшой код в моем проекте библиотеки, который использует пакет std::chrono
:
uint64_t now = duration_cast<milliseconds>(steady_clock::now().time_since_epoch()).count();
bool is_old = (120 * 1000 < (now - data_holder->getTimestamp()));
// some logging to print out above values
LOG4CXX_WARN(logger, "data logging, now: " << now << ", data holder timestamp: " << data_holder->getTimestamp() << ", is_old: " << is_old << ", difference: " << (now - data_holder->getTimestamp()));
В приведенном выше коде data_holder->getTimestamp()
равно uint64_t
, который возвращает отметку времени в миллисекундах.
Теперь, когда я распечатываю значение переменной now
, я вижу это 433425679
, а когда я распечатываю значение data_holder->getTimestamp()
, которое равно 1437943796841
, разница между текущим временем и временной меткой держателя данных составляет 18446742636199180454
, как показано ниже в журналах:
2015-07-26 13:49:56,850 WARN 0x7fd050bc9700 simple_process - data logging, now: 433425679 , data holder timestamp: 1437943796841 , is_old: 1 , difference: 18446742636199180454
Теперь, если я конвертирую временную метку держателя данных 1437943796841
с помощью конвертера эпох, я вижу это:
Your time zone: 7/26/2015, 1:49:56 PM
что точно совпадает с отметкой времени, показанной в журналах 2015-07-26 13:49:56,850 WARN
, так что это означает, что мои данные не выглядят как данные 120-секундной давности. Если да, то почему я вижу значение is_old
как 1
?
Похоже, что значение data_holder->getTimestamp()
исходит из приведенного ниже кода в нашей кодовой базе, а затем мы сравниваем его для проверки 120-секундных старых данных.
// is this the problem?
struct timeval val;
gettimeofday(&val, NULL);
uint64_t time_ms = uint64_t(val.tv_sec) * 1000 + val.tv_usec / 1000;
Теперь, внимательно прочитав о различных реализациях часов в C++, похоже, что мы должны использовать одни и те же часы для сравнения.
Является ли мой приведенный выше код, в котором я вычисляю значение data_holder->getTimestamp()
, проблемой? так как я не использую steady_clock
, поэтому время эпохи будет другим, и поэтому я вижу эту проблему?
Теперь мой вопрос: какой код я должен использовать, чтобы решить эту проблему? Должен ли я также использовать steady_clock
для кода data_holder->getTimestamp()
? Если да, то как правильно?
Также тот же код отлично работает в Ubuntu 12, но не работает в Ubuntu 14. Я запускаю все статически связанные библиотеки. Для Ubuntu 12 код компилируется в Ubuntu 12 с компилятором 4.7.3, а для Ubuntu 14 код компилируется в Ubuntu 14 с компилятором 4.8.2.
std::chrono::steady_clock
не связан со временем настенных часов (std::chrono::system_clock
). Другими словами, вы не можете сравнивать время по постоянным часам со временем по системным (настенным) часам. Аgettimeofday
возвращает время настенных часов. - person Some programmer dude   schedule 20.08.2015