首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >格式化struct timespec

格式化struct timespec
EN

Stack Overflow用户
提问于 2011-11-29 08:24:32
回答 5查看 121.3K关注 0票数 34

如何将struct timespec格式化为字符串?这个结构是由clock_gettime()返回的,例如在Linux端的gcc:

代码语言:javascript
复制
struct timespec {
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-29 09:28:53

格式化它的一种方法是:

代码语言:javascript
复制
printf("%lld.%.9ld", (long long)ts.tv_sec, ts.tv_nsec);
票数 45
EN

Stack Overflow用户

发布于 2013-02-07 16:45:16

我也想问同样的问题。我目前的解决方案是获得这样的字符串:2013-02-07 09:24:40.749355372我不确定是否有比这更直接的解决方案,但至少字符串格式可以通过这种方法自由配置。

代码语言:javascript
复制
#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;
    }
}

输出:

代码语言:javascript
复制
gcc mwe.c -lrt 
$ ./a.out 
CLOCK_REALTIME: res=1 ns, time=2013-02-07 13:41:17.994326501
票数 24
EN

Stack Overflow用户

发布于 2021-01-19 14:49:51

下面将返回一个符合ISO8601和RFC3339的UTC时间戳,包括纳秒。

它使用strftime(),它与struct timespecstruct timeval一样好用,因为它关心的是秒数,两者都提供。然后追加纳秒(注意用零填充!)以及UTC后缀“Z”。

输出示例:2021-01-19T04:50:01.435561072Z

代码语言:javascript
复制
#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):

代码语言:javascript
复制
gcc foo.c -o foo -lrt
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8304259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档