Как получить текущее время в миллисекундах от C в Linux?

Как получить текущее время в Linux за миллисекунды?

Ответ 1

Это может быть достигнуто с помощью функции clock_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

    printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
           (intmax_t)s, ms);
}

Если ваша цель - измерять прошедшее время, а ваша система поддерживает параметр "монотонные часы", вам следует использовать CLOCK_MONOTONIC вместо CLOCK_REALTIME.

Ответ 2

Вам нужно сделать что-то вроде этого:

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

Ответ 3

Ниже приведена функция 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() не требуется, поскольку это не будет иметь никакого значения.

И, согласно man-странице gettimeofday(), использование структуры timezone устарело, поэтому аргумент tz обычно должен быть указан как NULL, для получения дополнительной информации см. справочную страницу.

Ответ 4

Используйте gettimeofday(), чтобы получить время в секундах и микросекундах. Комбинация и округление до миллисекунд остается в виде упражнения.

Ответ 5

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 */
};

Подробнее здесь: fooobar.com/questions/9684/...

Ответ 6

Если вы хотите что-то ввести в свою командную строку, то date +%H:%M:%S.%N даст вам время с наносекундами.