如何格式struct timespec
string? 这个结构是通过例如在Linux gcc上的clock_gettime()
返回的:
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
您可以将tv_sec参数传递给某些格式化函数。 看看gmtime,localtime()。 然后看看snprintf。
你可以使用std :: stringstream。 你可以流入任何东西:
std::stringstream stream; stream << 5.7; stream << foo.bar; std::string s = stream.str();
这应该是一个相当一般的方法。 (仅适用于C ++,但您也问过这个语言的问题。)