Formatting struct timespec

后端 未结 4 1037
余生分开走
余生分开走 2020-12-23 17:04

How to format struct timespec to string? This structure is returned e.g. by clock_gettime() on Linux gcc:

struct timespec {
    tim         


        
相关标签:
4条回答
  • 2020-12-23 17:24

    I wanted to ask the same question. Here is my current solution to obtain a string like this: 2013-02-07 09:24:40.749355372 I am not sure if there is a more straight forward solution than this, but at least the string format is freely configurable with this approach.

    #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;
        }
    }
    

    output:

    gcc mwe.c -lrt 
    $ ./a.out 
    CLOCK_REALTIME: res=1 ns, time=2013-02-07 13:41:17.994326501
    
    0 讨论(0)
  • 2020-12-23 17:30

    One way to format it is:

    printf("%lld.%.9ld", (long long)ts.tv_sec, ts.tv_nsec);
    
    0 讨论(0)
  • 2020-12-23 17:33

    You can pass the tv_sec parameter to some of the formatting function. Have a look at gmtime, localtime(). Then look at snprintf.

    0 讨论(0)
  • 2020-12-23 17:41

    You could use a std::stringstream. You can stream anything into it:

    std::stringstream stream;
    stream << 5.7;
    stream << foo.bar;
    
    std::string s = stream.str();
    

    That should be a quite general approach. (Works only for C++, but you asked the question for this language too.)

    0 讨论(0)
提交回复
热议问题