开发者

Using strftime in C, how can I format time exactly like a Unix timestamp?

开发者 https://www.devze.com 2022-12-08 19:50 出处:网络
Here\'s the sort of time formatting I\'m after: 2009-1开发者_如何学JAVA0-08 04:31:33.918700000 -0500

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

2009-1开发者_如何学JAVA0-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?


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).


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


%z (lower case z).

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

0

精彩评论

暂无评论...
验证码 换一张
取 消