使用strftime时调试断言失败

时间:2014-05-23 06:43:50

标签: c datetime strftime

我的代码如下,

time_t t;
struct tm tm;
struct tm * tmp;
time( &t ); 
tmp = gmtime(&t);

char buf[100];
strftime(buf, 42, "%F", tmp); // assertion failure

它表示`表达式:(“无效的格式指令”,0)。我想将时间转换为Short YYYY-MM-DD日期,相当于%Y-%m-%d格式。

当我尝试这个时,会发生同样的事情,

const char* fmt = "%a, %d %b %y %T %z";

if (strftime(buf, sizeof(buf), fmt, tmp) == 0) // assertion failure
{ 
    fprintf(stderr, "strftime returned 0");
    exit(EXIT_FAILURE); 
} 

2 个答案:

答案 0 :(得分:1)

C99引入了

%F%T%z,而C ++ 11只引入了C ++。从您对问题的评论来看,您似乎正在使用Microsoft在VisualStudio 2010中部分实现C ++ 11.不幸的是,您唯一的选择是:

  • 更新你的IDE(我不知道以后的版本是否支持这个,但我想象他们这样做了)
  • 切换到另一个IDE(任何为其编译器使用GCC的东西肯定会支持这个)
  • 避免使用较新的格式化标记(您可以在此处找到一个列表:http://www.cplusplus.com/reference/ctime/strftime/黄色是新的)

答案 1 :(得分:0)

以下对我有用:

#include <stdio.h>
#include <time.h>

int main(int argc, char **argv)
{
    time_t t;
    struct tm tm;
    struct tm * tmp;
    time( &t ); 
    tmp = gmtime(&t);

    const char* fmt = "%a, %d %b %y %T %z";
    char buf[100];
    if (strftime(buf, sizeof(buf), fmt, tmp) == 0) // assertion failure
    { 
        fprintf(stderr, "strftime returned 0");
        return 1; 
    }
    printf("%s\n", buf);

    return 0;
}    

输出结果为:

Fri, 23 May 14 06:48:27 +0000