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()
, andstruct 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.
精彩评论