【发布时间】:2012-11-25 22:31:20
【问题描述】:
我是 C 的新手。当我练习 C 来隐蔽时间刺痛来回构造 tm 时。我注意到了一些不同。请指教我做错了什么。
#include <string.h>
#include <stdio.h>
#include <time.h>
/*
test different format string to strptime
" %A, %b %d, %X %z %Y "
" %A, %b %d, %X %Z %Y "
*/
int main(int argc,char *argv[])
{
char date[] = "6 Mar 2001 12:33:45";
char fmt[80];
struct tm tm;
if (argc==1) return 0;
strcpy(fmt,argv[1]);
memset(&tm, 0, sizeof(struct tm));
if (strptime(date,"%d %b %Y %H:%M:%S",&tm)==NULL) printf("error\n");
char buf[128];
strftime(buf, sizeof(buf), fmt, &tm);
printf("%s\n", buf);
printf("%d\n", tm.tm_isdst);
if (strptime(buf,fmt,&tm)==NULL) printf("error\n");
else {
printf("year: %d; month: %d; day: %d;\n",
tm.tm_year, tm.tm_mon, tm.tm_mday);
printf("hour: %d; minute: %d; second: %d\n",
tm.tm_hour, tm.tm_min, tm.tm_sec);
printf("week day: %d; year day: %d\n", tm.tm_wday, tm.tm_yday);
}
return 0;
}
当我使用“ %A, %b %d, %X %z %Y ”作为转换格式参数时,代码提供的结果如下:
~/user$ ./test_time " %A, %b %d, %X %z %Y "
Tuesday, Mar 06, 12:33:45 +0000 2001
0
year: 101; month: 2; day: 6;
hour: 12; minute: 33; second: 45
week day: 2; year day: 64
当我将参数更改为“ %A, %b %d, %X %Z %Y ”时,代码无法解析 strftime 生成的格式完全相同的时间字符串。
~/user$ ./test_time " %A, %b %d, %X %Z %Y "
Tuesday, Mar 06, 12:33:45 EET 2001
0
error
我是否错过了让 strptime 正确解析时区名称的内容?
提前致谢,
阿尔伯特
【问题讨论】:
-
这在我看来像 C。为什么要标记它 C++,尤其是 C++11?
-
@Pascal Cuoq 你是对的。是C代码。我用 g++ 编译它。应该没关系吧?
-
只要您牢记以下差异列表,就不应该这样做。 stackoverflow.com/questions/10461331/… 。而且该页面似乎甚至没有列出我的最爱:在 C++ 中,'c' 的类型为
char,而“c”的类型为const char*。
标签: c timezone strptime timestamp-with-timezone