Подтвердить что ты не робот

Форматирование struct timespec

Как отформатировать struct timespec в строку? Эта структура возвращается, например. clock_gettime() в Linux gcc:

struct timespec {
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};
4b9b3361

Ответ 1

Один из способов форматирования:

printf("%lld.%.9ld", (long long)ts.tv_sec, ts.tv_nsec)

Ответ 2

Я хотел задать тот же вопрос. Вот мое текущее решение для получения такой строки: 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

Ответ 3

Вы можете передать параметр tv_sec в функцию форматирования. Посмотрите на gmtime, localtime(). Затем посмотрите на snprintf.

Ответ 4

Вы можете использовать std:: stringstream. В него можно вносить что-либо:

std::stringstream stream;
stream << 5.7;
stream << foo.bar;

std::string s = stream.str();

Это должен быть довольно общий подход. (Работает только для С++, но вы тоже задали вопрос для этого языка.)