Як отримати поточний час на 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