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

Vla*_*ala 9 c strftime

这是我之后的格式化时间:

2009-10-08 04:31:33.918700000 -0500
Run Code Online (Sandbox Code Playgroud)

我目前正在使用这个:

strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S %Z", ts);
Run Code Online (Sandbox Code Playgroud)

这使:

2009-10-11 13:42:57 CDT
Run Code Online (Sandbox Code Playgroud)

哪个很接近,但不准确.我似乎无法-0500在最后显示任何内容.另外我把秒作为int.

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

unw*_*ind 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); 
    }
Run Code Online (Sandbox Code Playgroud)

修复您遇到的问题:

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

我尝试通过第二个struct timezone *参数手动重新创建时区偏移量gettimeofday(),但在我的机器上它返回的偏移量为0,这是不正确的.该手册gettimefday()有相当大谈时区的Linux下的处理(这是我测试过的OS).

  • 似乎每个人都错过了%z完全是标准C99的事实.它是(免费提供)草案n1256(tc3工作文件)以及官方标准文件,它也在POSIX中指定(http://pubs.opengroup.org/onlinepubs/9699919799/functions/strftime.html) . (4认同)