在 C 中使用 strftime,如何将时间格式化为与 Unix 时间戳完全相同的格式?

发布于 2024-08-07 21:31:52 字数 335 浏览 5 评论 0原文

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

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 的任何内容。另外,我将秒作为整数获取。

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

Here's the sort of time formatting I'm after:

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

I'm currently using this:

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

Which gives:

2009-10-11 13:42:57 CDT

Which is close, but not exact. I can't seem to find anything on displaying -0500 at the end. Plus I'm getting the seconds as an int.

How can I resolve these two issues?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

贪了杯 2024-08-14 21:31:52

我想出了这个:

    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,它有一个微秒成员以获得更高的精度。
  • 使用两步方法,我们首先构建一个包含除微秒之外的所有数据的字符串。
  • 使用小写“z”作为时区偏移量。这似乎是一个 GNU 扩展。

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

I came up with this:

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

Fixes for the problems you had:

  • Use gettimeofday(), and struct timeval, which has a microseconds member for the higher precision.
  • Use a two-step approach, where we first build a string containing all the data except the microseconds.
  • Use lower-case 'z' for the timezone offset. This seems to be a GNU extension.

I tried re-creating the timezone offset manually, through the second struct timezone * argument of gettimeofday(), but on my machine it returns an offset of 0 which is not correct. The manual page for gettimefday() has quite a lot to say about the handling of timezones under Linux (which is the OS I tested on).

绿萝 2024-08-14 21:31:52

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

"%Y-%m-%d %T %z", but it seems %z is a GNU extension.

桃扇骨 2024-08-14 21:31:52

%z(小写 z)。

然而,这并没有出现在 Posix 规范中。 Google 带我转了一圈回到这里

%z (lower case z).

However, this does not appear in the Posix specification. Google took me in a circle back here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文