Як отримати поточний час на 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 , який ігнорує часовий пояс, але ви можете вказати часовий пояс, якщо потрібно.
@Оновити - часовий пояс
Оскільки long
подання часу не має значення або не tz
впливає на сам часовий пояс, тому встановлення параметра gettimeofday () не є необхідним, оскільки це не призведе до різниці.
І, відповідно до man сторінки gettimeofday()
, використання timezone
структури застаріло, тому tz
аргумент, як правило, повинен бути вказаний як NULL, для деталей перевірте man сторінку.
tz
параметр gettimeofday()
як &(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