2015-08-24 3 views
2

У меня есть код ниже, из которого мы пытаемся получить текущую временную метку в микросекундах с момента времени, но мы используем steady_clock.Получить текущую временную метку в микросекундах с эпохи?

inline uint64_t get_timestamp() 
{ 
    std::chrono::time_point<std::chrono::steady_clock> ts = std::chrono::steady_clock::now(); 
    return std::chrono::duration_cast<std::chrono::microseconds>(ts.time_since_epoch()).count(); 
} 

Является ли это правильный способ сделать это так, как в моем понимании steady_clock используется для измерения времени прохождения, чтобы не получить текущее время суток? Или я должен использовать system_clock для этого, как, как показано ниже:

inline uint64_t get_timestamp() 
{ 
    std::chrono::time_point<std::chrono::system_clock> ts = std::chrono::system_clock::now(); 
    return std::chrono::duration_cast<std::chrono::microseconds>(ts.time_since_epoch()).count(); 
} 

мне нужно использовать std::chrono пакет только так это то, что весь наш код использует.

+2

@ πάνταῥεῖ 'станд :: uint64_t'? Во всяком случае, немного дольше. Текущее время с эпохи составляет 1440440480 секунд на момент написания этой статьи, которая составляет 0x51dac207a0000 микросекунд. –

+1

@ πάνταῥεῖ 'uint64_t' ... –

+0

Извините, что парни смущены точностью наносекунд на данный момент. –

ответ

7

Эпохи часов хронографа неуточнены. Но практически вы можете думать о хроно часы так:

  1. Эпоха steady_clock время запущен приложение плюс подписанное случайное смещение. То есть вы не можете зависеть от того, какая эпоха одинакова во всех запусках приложений. Но эпоха останется стабильной, пока приложение работает.

  2. Эпоха system_clock - это время с Новых 1970-х годов, не считая прыжковых секунд, в часовой пояс UTC. Различные реализации реализуют это с различной точностью: libC++ подсчитывает микросекунды, VS - 1/10 микросекунд, а gcc - наносекунды.

  3. high_resolution_clock иногда является псевдонимом типа для steady_clock, а иногда и псевдонимом типа для system_clock.

Для отметки времени в микросекундах я рекомендую первое определение этого типа псевдонима:

using time_stamp = std::chrono::time_point<std::chrono::system_clock, 
              std::chrono::microseconds>; 

магазина, который, вместо uint64_t. Тип безопасности такого типа позволит вам избежать бесчисленных ошибок времени выполнения. Вместо этого вы обнаружите свои ошибки во время компиляции.

Вы можете получить текущий time_stamp с:

using namespace std::chrono; 
time_stamp ts = time_point_cast<microseconds>(system_clock::now()); 
+0

Спасибо за отличное предложение. Будем ли мы видеть какие-либо проблемы в високосные годы, если мы будем использовать 'stable_clock'? – user1950349

+0

Вы имели в виду 'system_clock' ?! –

+0

@ user1950349 - [прыжок секунд] (https://en.wikipedia.org/wiki/Leap_second) корректировки, сделанные до официального времени, потому что орбита Земли слегка шатается (* очень * слегка), поэтому иногда мы приходим на полсекунды рано. Компьютеры часто игнорируют это, поскольку достаточно сложно вычислить время. –

0

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

__int64 microseconds_since_epoch = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count(); 
Смежные вопросы