9

这是我所追求的时间格式:

2009-10-08 04:31:33.918700000 -0500

我目前正在使用这个:

strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", ts);

这使:

2009-10-11 13:42:57 CDT

这很接近,但不准确。我似乎无法-0500在最后显示任何内容。另外,我将秒数作为整数。

我该如何解决这两个问题?

4

3 回答 3

24

我想出了这个:

    char            fmt[64], buf[64];
    struct timeval  tv;
    struct tm       *tm;

    gettimeofday(&tv, NULL);
    if((tm = localtime(&tv.tv_sec)) != NULL)
    {
            strftime(fmt, sizeof fmt, "%Y-%m-%d %H:%M:%S.%%06u %z", tm);
            snprintf(buf, sizeof buf, fmt, tv.tv_usec);
            printf("'%s'\n", buf); 
    }

修复您遇到的问题:

  • 使用gettimeofday(), 和struct timeval, 它有一个 microseconds 成员以获得更高的精度。
  • 使用两步法,我们首先构建一个包含除微秒之外的所有数据的字符串。
  • 使用小写的“z”作为时区偏移量。这似乎是一个 GNU 扩展。

struct timezone *我尝试通过 的第二个参数手动重新创建时区偏移量gettimeofday(),但在我的机器上它返回的偏移量为 0,这是不正确的。手册页gettimefday()很多关于在 Linux(这是我测试过的操作系统)下处理时区的内容。

于 2009-10-11T20:12:15.320 回答
1

%z(小写 z)。

但是,这并没有出现在Posix 规范中。谷歌带我绕了一圈回到这里

于 2009-10-11T20:06:33.957 回答
1

"%Y-%m-%d %T %z",但它似乎%z是一个 GNU 扩展。

于 2009-10-11T20:07:10.100 回答