_struct timespec
_を文字列にフォーマットする方法は?この構造は返されます。 Linux gccのclock_gettime()
によって:
_struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
_
フォーマットする1つの方法は次のとおりです。
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
Tv_secパラメーターをいくつかのフォーマット関数に渡すことができます。 gmtime、localtime()をご覧ください。次に、snprintfを見てください。