Как получить текущее время в миллисекундах от C в Linux? - PullRequest
79 голосов
/ 21 сентября 2010

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

Ответы [ 6 ]

89 голосов
/ 28 июня 2013

Этого можно достичь с помощью функции POSIX 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
    if (ms > 999) {
        s++;
        ms = 0;
    }

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

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

57 голосов
/ 21 сентября 2010

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

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
30 голосов
/ 13 июня 2013

Ниже приведена функция 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 стр.

13 голосов
/ 21 сентября 2010

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

6 голосов

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

0 голосов
/ 21 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...