Как узнать текущее время в Linux в миллисекундах?
Ответы:
Этого можно добиться с помощью функции POSIXclock_gettime .
В текущей версии POSIX, gettimeofdayбудет отмечен устаревшими . Это означает, что он может быть удален из будущей версии спецификации. Разработчикам приложений рекомендуется использовать эту clock_gettimeфункцию вместо gettimeofday.
Вот пример того, как использовать clock_gettime:
#define _POSIX_C_SOURCE 200809L
#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
void print_current_time_with_ms (void)
{
long ms; // Milliseconds
time_t s; // Seconds
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
if (ms > 999) {
s++;
ms = 0;
}
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
(intmax_t)s, ms);
}
Если ваша цель - измерить прошедшее время, и ваша система поддерживает параметр «монотонные часы», вам следует рассмотреть возможность использования CLOCK_MONOTONICвместо CLOCK_REALTIME.
gccкоманде.
sкогда это произойдет. Наверное, редкое событие, но лишняя цифра может вызвать проблемы.
Ниже приведена функция util для получения текущей отметки времени в миллисекундах:
#include <sys/time.h>
long long current_timestamp() {
struct timeval te;
gettimeofday(&te, NULL); // get current time
long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
// printf("milliseconds: %lld\n", milliseconds);
return milliseconds;
}
О часовом поясе :
gettimeofday () поддерживает указание часового пояса, я использую NULL , что игнорирует часовой пояс, но вы можете указать часовой пояс, если необходимо.
@Update - часовой пояс
Поскольку longпредставление времени не имеет отношения к самому tzчасовому поясу и не зависит от него , установка param для gettimeofday () не требуется, поскольку это не будет иметь никакого значения.
И, по словам мужчины странице gettimeofday(), использование timezoneструктуры является устаревшим, поэтому tzаргумент должен нормально быть указан как NULL, для информации , пожалуйста , смотрите страницы.
tzпараметр gettimeofday()as &(struct timezone tz = {480, 0})не будет получать никаких предупреждений, и это не повлияет на результат, что имеет смысл, поскольку longпредставление времени не имеет отношения к по самому часовому поясу, верно?
NULLявляется разумным значением для передачи. И я считаю, что тестирование - всегда хороший способ доказать что-то.
Используйте, gettimeofday()чтобы получить время в секундах и микросекундах. Объединение и округление до миллисекунд оставлено как упражнение.
C11 timespec_get
Он возвращается с точностью до наносекунд, округленной до разрешения реализации.
Это уже реализовано в Ubuntu 15.10. API выглядит так же, как POSIX clock_gettime.
#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Подробнее здесь: https://stackoverflow.com/a/36095407/895245
Полученный из ответа Дэна Молдинга POSIX, это должно работать:
#include <time.h>
#include <math.h>
long millis(){
struct timespec _t;
clock_gettime(CLOCK_REALTIME, &_t);
return _t.tv_sec*1000 + lround(_t.tv_nsec/1.0e6);
}
Также, как указал Дэвид Гайон: скомпилировать с -lm