Linux에서 C에서 현재 시간을 밀리초 단위로 가져오려면 어떻게 해야 합니까?
Linux에서 현재 시간을 밀리초 단위로 가져오려면 어떻게 해야 합니까?
이것은 POSIX 기능을 사용하여 달성할 수 있습니다.
현재 버전의 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
.
현재 타임스탬프를 밀리초 단위로 취득하기 위한 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() support를 사용하여 시간대를 지정합니다.NULL은 시간대를 무시하지만 필요에 따라 시간대를 지정할 수 있습니다.
@Update - 시간대
그 이후로는long
시간 표현은 시간대 자체와 관련이 없거나 영향을 받지 않으므로 설정tz
gettimeofday()의 param은 차이가 없기 때문에 필요하지 않습니다.
그리고, 의 man page에 따르면gettimeofday()
, 의 사용방법timezone
구조가 구식이기 때문에tz
인수는 보통 NULL로 지정해야 합니다.자세한 내용은 man 페이지를 참조하십시오.
다음과 같은 작업을 수행해야 합니다.
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
C11timespec_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 Molding의 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/1e6);
}
또한 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;
}
초단위와 마이크로초단위로 시간을 가져옵니다.조합하여 밀리초로 반올림하는 것은 연습으로 남습니다.
언급URL : https://stackoverflow.com/questions/3756323/how-to-get-the-current-time-in-milliseconds-from-c-in-linux
'source' 카테고리의 다른 글
JVM 인수 없이 Java 9에서 "불법 반사 액세스" 경고를 숨기려면 어떻게 해야 합니까? (0) | 2022.09.03 |
---|---|
Java에서 이중을 부동으로 변환 (0) | 2022.09.03 |
경량 Java 객체 캐시 API (0) | 2022.09.03 |
Java에서 이진 문자열을 기본 10 정수로 변환하는 방법 (0) | 2022.09.03 |
Eclipse, ADT 22.6에서 Android Virtual Devices(AVD)를 만들거나 편집할 수 없음 (0) | 2022.09.03 |