Есть ли простой способ получить масштабированную метку времени Unix в C ++ - PullRequest
4 голосов
/ 14 января 2010

Я портирую немного PHP на C ++. Часть нашего кода базы данных хранит значения времени как метки времени Unix * 100 PHP содержит код, который выглядит примерно так:

//PHP 
static function getTickTime()
{
   return round(microtime(true)*100);
}

Мне нужно что-то вроде этого:

//C++
uint64_t getTickTime()
{
   ptime Jan1st1970(date(1970, 1, 1));
   ptime Now = microsecond_clock::local_time();
   time_duration diff = Now - Jan1st1970;
   return static_cast<uint64_t>(diff.total_seconds()*100);
}

Что-то вроде этого разумно? Есть ли более аккуратное решение? Есть ли в этом коде что-то противное, чего я не вижу? (Думаю, я не достаточно опытен с boost :: date_time, чтобы знать эти вещи)

Ответы [ 3 ]

1 голос
/ 14 января 2010

Решение, предложенное dauphic, можно изменить примерно так:

uint64_t getTickTime()
{
  timeval tim;
  gettimeofday(&tim, NULL);
  return tim.tv_sec*100 + tim.tv_usec/10000;
}

Не могу придумать более аккуратного решения, чем это.

1 голос
/ 14 января 2010

Самое удобное и портативное решение - использовать функцию time(), определенную в <ctime>, которая возвращает количество секунд с начала эпохи Unix.

Если вы используете повышение, вам понадобится universal_time(), а не local_time(), поскольку эпоха указана в UTC.

0 голосов
/ 14 января 2010

Если вы работаете в Unix, включите

timeval tim;
gettimeofday(&tim, NULL);
return tim.tv_usec;

Если в Windows нет хорошего способа получить разрешение в микросекундах, тем более что в нем используется другая эпоха. Для этого примера требуется только .

FILETIME tim;
GetSystemTimeAsFileTime(&tim);
ULARGE_INTEGER ms;
ms.LowPart = tim.dwLowDateTime;
ms.HighPart = tim.dwHighDateTime;
return ms.QuadPart * 10 + <nanoseconds from January 1, 1609 to January 1, 1970>; // ms represents how many 100s of nanoseconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...