Как узнать текущее время в Linux в миллисекундах?
86
Этого можно добиться с помощью функции 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
когда это произойдет. Наверное, редкое событие, но лишняя цифра может вызвать проблемы.Вам нужно сделать что-то вроде этого:
struct timeval tv; gettimeofday(&tv, NULL); double time_in_mill = (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ; // convert tv_sec & tv_usec to millisecond
источник
Ниже приведена функция 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; }
О часовом поясе :
@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
источник