首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Struct timeval转换为可打印格式

将Struct timeval转换为可打印格式
EN

Stack Overflow用户
提问于 2010-03-09 20:31:40
回答 7查看 66.1K关注 0票数 30

您能告诉我如何将一个struct timeval实例格式化为人类可读的格式,如"2010-01-01 15:35:10.0001"?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-03-09 20:39:10

使用localtimestrftime转换tv_sec,然后追加tv_usec部件。

票数 14
EN

Stack Overflow用户

发布于 2010-03-09 20:45:51

您需要手动附加微秒部分,因为它不在strftime()处理的struct tm中。下面是一段代码:

代码语言:javascript
复制
struct timeval tv;
time_t nowtime;
struct tm *nowtm;
char tmbuf[64], buf[64];

gettimeofday(&tv, NULL);
nowtime = tv.tv_sec;
nowtm = localtime(&nowtime);
strftime(tmbuf, sizeof tmbuf, "%Y-%m-%d %H:%M:%S", nowtm);
snprintf(buf, sizeof buf, "%s.%06ld", tmbuf, tv.tv_usec);

请注意,我们如何使用06的显式精度来获取填充为零的微秒字段。由于微秒从0到999,999,999,因此必须始终填充为6位数字。我们不想把57微秒误认为570,000 (比较"1.57“和"1.000057")。

票数 73
EN

Stack Overflow用户

发布于 2015-05-09 12:28:33

结合前面的答案和注释,将格式更改为RFC3339-compliant,并检查所有错误条件,您将得到以下结果:

代码语言:javascript
复制
#include <stdio.h>
#include <sys/time.h>

ssize_t format_timeval(struct timeval *tv, char *buf, size_t sz)
{
  ssize_t written = -1;
  struct tm *gm = gmtime(&tv->tv_sec);

  if (gm)
  {
    written = (ssize_t)strftime(buf, sz, "%Y-%m-%dT%H:%M:%S", gm);
    if ((written > 0) && ((size_t)written < sz))
    {
      int w = snprintf(buf+written, sz-(size_t)written, ".%06dZ", tv->tv_usec);
      written = (w > 0) ? written + w : -1;
    }
  }
  return written;
}

int main() {
  struct timeval tv;
  char buf[28];
  if (gettimeofday(&tv, NULL) != 0) {
    perror("gettimeofday");
    return 1;
  }
  if (format_timeval(&tv, buf, sizeof(buf)) > 0) {
    printf("%s\n", buf);
    // sample output:
    // 2015-05-09T04:18:42.514551Z
  }
  return 0;
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2408976

复制
相关文章

相似问题

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