c/c++;strtime()不分析%Z时区名称
我是新来C的。当我练习C来隐藏时间刺痛来来回构造tm时。我注意到了一些不同。请告诉我我做错了什么c/c++;strtime()不分析%Z时区名称,c,timezone,strptime,timestamp-with-timezone,C,Timezone,Strptime,Timestamp With Timezone,我是新来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[
#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”时,代码无法解析strftime以完全相同的格式生成的时间字符串
~/user$ ./test_time " %A, %b %d, %X %Z %Y "
Tuesday, Mar 06, 12:33:45 EET 2001
0
error
我是否错过了让strtime正确解析时区名称的功能
提前感谢,
艾伯特我不确定你所做的是否有效。github的负责人就此事发表了以下看法:
case 'Z':
/* XXX How to handle this? */
break
然后是对小写字母'z'
stuff:-)的稍微“充实”的处理
因此,这里最可能发生的情况是,当格式字符串为%Z
时,字符串指针没有超过EET
,因此当它试图处理%Y
时,它会正确地抱怨EET
不是有效年份。“%%”
的简单例子证实了这一点,其中代码实际上会使输入字符串指针向前移动rp
:
case '%':
/* Match the `%' character itself. */
match_char ('%', *rp++);
break;
Linux手册页还说明了扩展(其中'Z'
就是其中之一):
出于对称性的原因,glibc尝试为strtime()支持与strftime(3)相同的格式字符。(在大多数情况下,会解析相应的字段,但不会更改tm中的任何字段。)
此外,国家(我的斜体):
%Z:时区名称。注:目前,这项措施尚未完全实施。识别格式,使用输入,但未设置tm中的字段
<> p>所以实际上我认为这是一个bug,尽管它可以很容易地用文档更改来修复,以假装它可以处理<代码> z < /代码>类型时区。
我在bugzilla中找不到任何相关的bug,所以我在glibc上提出了一个bug。你可以追踪它
附录:根据上一段和中的bug报告链接,我建议的更改是为了使代码与文档保持一致。希望它没有bug,否则我看起来会很傻,因为它只有五行代码
这看起来像C。你为什么要把它加上C++,特别是C++ 11?@帕斯卡-库克,你是对的。这是C代码。我用g++编译了它。不要紧,对吧?只要你记住下面列出的差异,就不应该。那个页面甚至没有列出我的最爱:在C++中,“C”有类型<代码> char < />代码,而“C”有类型<代码> const char */COD>。听起来很合理。据我所知,我期望类似于strftime的实现。指定不受支持的描述符有那么困难吗?您的期望非常合理,我自己也有。正如尤达所说:“支持。或者不支持。没有‘尝试’。”他们应该要么实现这一点,要么停止假装它存在。当我接触到一台真正的电脑时(这个安卓标签很难打),我会考虑提交一份bug报告。
case '%':
/* Match the `%' character itself. */
match_char ('%', *rp++);
break;