Получить текущую временную метку в микросекундах с эпохи?

У меня есть приведенный ниже код, из которого мы пытаемся получить текущую временную метку в микросекундах с начала эпохи, но мы используем 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 только потому, что он используется во всем нашем коде.


person user1950349    schedule 24.08.2015    source источник
comment
@pάνταῥεῖ std::uint64_t? Во всяком случае, ненадолго. Текущее время с начала эпохи составляет 1440440480 секунд на момент написания этой статьи, что составляет 0x51dac207a0000 микросекунд.   -  person Nik Bougalis    schedule 24.08.2015
comment
Извините, ребята, на данный момент перепутали с точностью до наносекунд.   -  person πάντα ῥεῖ    schedule 24.08.2015


Ответы (2)


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

  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());
person Howard Hinnant    schedule 24.08.2015
comment
Спасибо за отличное предложение. Увидим ли мы какие-либо проблемы в високосные годы, если будем использовать steady_clock? - person user1950349; 24.08.2015
comment
Вы имели в виду system_clock?! - person Howard Hinnant; 24.08.2015
comment
@user1950349 — високосные секунды — это поправки к официальному времени, поскольку орбита Земли слегка шатается ( очень немного), поэтому иногда мы прибываем на полсекунды раньше. Компьютеры часто игнорируют это, так как в любом случае достаточно сложно вычислить время. - person Bo Persson; 24.08.2015
comment
Но если вы действительно хотите поиграть с дополнительными секундами, вот библиотека + пример того, как это сделать: howardhinnant.github.io/tz.html#flightexample2 - person Howard Hinnant; 24.08.2015
comment
Да, я имею в виду system_clock извините за путаницу. - person user1950349; 24.08.2015
comment
system_clock подсчитывает время Unix (en.wikipedia.org/wiki/Unix_time), которое представляет собой не что иное, как количество невисокосных секунд с 1970 года (UTC). И, как указано выше, на самом деле это количество микросекунд. Он ничего не знает о днях, неделях, месяцах, годах или високосных годах. Если вы хотите преобразовать их в эти единицы, я рекомендую эту библиотеку дат: (который будет корректно обрабатывать високосные годы). - person Howard Hinnant; 24.08.2015
comment
@HowardHinnant Я очень ценю, что вы поделились этим кодом. Впервые вижу упоминание об этом. Спасибо. - person Captain Giraffe; 24.08.2015

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

uint64_t microseconds_since_epoch = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::system_clock::now().time_since_epoch()).count();
person Lorien Brune    schedule 28.09.2017