구조물 시간 지정 형식 지정
포맷 방법struct timespec
끈으로?이 구조물은 다음과 같이 반환됩니다.clock_gettime()
Linux gcc의 경우:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
포맷 방법 중 하나는 다음과 같습니다.
printf("%lld.%.9ld", (long long)ts.tv_sec, ts.tv_nsec);
저도 같은 질문을 하고 싶었습니다.다음은 이와 같은 문자열을 얻기 위한 현재 솔루션입니다.2013-02-07 09:24:40.749355372
이보다 더 간단한 솔루션이 있는지는 모르겠지만 적어도 문자열 형식은 이 접근 방식으로 자유롭게 구성할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NANO 1000000000L
// buf needs to store 30 characters
int timespec2str(char *buf, uint len, struct timespec *ts) {
int ret;
struct tm t;
tzset();
if (localtime_r(&(ts->tv_sec), &t) == NULL)
return 1;
ret = strftime(buf, len, "%F %T", &t);
if (ret == 0)
return 2;
len -= ret - 1;
ret = snprintf(&buf[strlen(buf)], len, ".%09ld", ts->tv_nsec);
if (ret >= len)
return 3;
return 0;
}
int main(int argc, char **argv) {
clockid_t clk_id = CLOCK_REALTIME;
const uint TIME_FMT = strlen("2012-12-31 12:59:59.123456789") + 1;
char timestr[TIME_FMT];
struct timespec ts, res;
clock_getres(clk_id, &res);
clock_gettime(clk_id, &ts);
if (timespec2str(timestr, sizeof(timestr), &ts) != 0) {
printf("timespec2str failed!\n");
return EXIT_FAILURE;
} else {
unsigned long resol = res.tv_sec * NANO + res.tv_nsec;
printf("CLOCK_REALTIME: res=%ld ns, time=%s\n", resol, timestr);
return EXIT_SUCCESS;
}
}
출력:
gcc mwe.c -lrt
$ ./a.out
CLOCK_REALTIME: res=1 ns, time=2013-02-07 13:41:17.994326501
다음은 나노초를 포함한 ISO8601 및 RFC3339 호환 UTC 타임스탬프를 반환합니다.
그것은 사용합니다.strftime()
와 함께 작동하는struct timespec
뿐만 아니라struct timeval
왜냐하면 둘 다 제공하는 초의 수에만 관심이 있기 때문입니다.그런 다음 나노초와 UTC 접미사 'Z'가 추가됩니다.
출력 예:2021-01-19T04:50:01.435561072Z
#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int utc_system_timestamp(char[]);
int main(void) {
char buf[31];
utc_system_timestamp(buf);
printf("%s\n", buf);
}
// Allocate exactly 31 bytes for buf
int utc_system_timestamp(char buf[]) {
const int bufsize = 31;
const int tmpsize = 21;
struct timespec now;
struct tm tm;
int retval = clock_gettime(CLOCK_REALTIME, &now);
gmtime_r(&now.tv_sec, &tm);
strftime(buf, tmpsize, "%Y-%m-%dT%H:%M:%S.", &tm);
sprintf(buf + tmpsize -1, "%09luZ", now.tv_nsec);
return retval;
}
GCC 명령줄 예제(참고:-lrt
):
gcc foo.c -o foo -lrt
tv_sec 매개 변수를 일부 형식 지정 함수에 전달할 수 있습니다.gm time, local time()을 확인합니다.그런 다음 snprintf를 봅니다.
std:: stringstream을 사용할 수 있습니다.무엇이든 스트리밍할 수 있습니다.
std::stringstream stream;
stream << 5.7;
stream << foo.bar;
std::string s = stream.str();
그것은 상당히 일반적인 접근 방식일 것입니다. (C++에서만 작동하지만, 이 언어에 대해서도 질문을 하셨습니다.)
언급URL : https://stackoverflow.com/questions/8304259/formatting-struct-timespec
'bestsource' 카테고리의 다른 글
C 함수로 셸 내장 명령을 실행하려면 어떻게 해야 합니까? (0) | 2023.07.23 |
---|---|
C를 사용하여 URL을 구문 분석하는 가장 좋은 방법은 무엇입니까? (0) | 2023.07.23 |
Backbone.js에서 하위 뷰를 초기화하고 렌더링하는 방법은 무엇입니까? (0) | 2023.07.23 |
한 데이터베이스/테이블에서 다른 데이터베이스/테이블로 데이터를 복사하는 방법 (0) | 2023.07.23 |
SpringBoot를 통해 SpringBoot 응용 프로그램을 디버깅하는 방법시험 (0) | 2023.07.23 |