[c] Linux의 C에서 현재 시간을 밀리 초 단위로 얻는 방법은 무엇입니까?

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.


답변

다음과 같이해야합니다.

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

시간대 정보 :

gettimeofday () 지원하여 시간대를 지정 하고, 시간대를 무시하는 NULL을 사용 하지만 필요한 경우 시간대를 지정할 수 있습니다.


@Update-시간대

때문에 long정도로 설정 시간대 자체로 수행 할 시간 표현이 관련이 없다 tz()은 gettimeofday의 PARAM 그것을 어떤 차이가 나지 않을 것이기 때문에, 불필요하다.

그리고의 man 페이지에 따르면 구조 gettimeofday()의 사용 timezone이 더 이상 사용되지 않으므로 tz인수는 일반적으로 NULL로 지정되어야합니다. 자세한 내용은 man 페이지를 확인하십시오.


답변

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


답변

Dan Moulding의 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);
}

또한 David Guyon이 지적한대로 : -lm으로 컴파일


답변

이 버전은 수학 라이브러리가 필요하지 않으며 clock_gettime ()의 반환 값을 확인했습니다.

#include <time.h>
#include <stdlib.h>
#include <stdint.h>

/**
 * @return milliseconds
 */
uint64_t get_now_time() {
  struct timespec spec;
  if (clock_gettime(1, &spec) == -1) { /* 1 is CLOCK_MONOTONIC */
    abort();
  }

  return spec.tv_sec * 1000 + spec.tv_nsec / 1e6;
}