我是C的新手。当我练习C来隐蔽时间来刺激来回构造时。 我发现有些不同。 请告诉我做错了什么。
#include #include #include /* 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("errorn"); char buf[128]; strftime(buf, sizeof(buf), fmt, &tm); printf("%sn", buf); printf("%dn", tm.tm_isdst); if (strptime(buf,fmt,&tm)==NULL) printf("errorn"); else { printf("year: %d; month: %d; day: %d;n", tm.tm_year, tm.tm_mon, tm.tm_mday); printf("hour: %d; minute: %d; second: %dn", tm.tm_hour, tm.tm_min, tm.tm_sec); printf("week day: %d; year day: %dn", 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正确解析时区名称的内容吗?
提前致谢,
阿尔伯特
我不确定你在做什么会起作用。 github上的glibc源代码就此事说:
case 'Z': /* XXX How to handle this? */ break
接下来是一些稍微更“粗暴”处理小写'z'
东西:-)
因此,最有可能发生的事情是,当格式字符串为%Z
,字符串指针不会超过EET
,因此当它尝试处理%Y
,它会正确地抱怨EET
不是有效年份。 这是由"%%"
的简单情况证实的,其中代码实际上提前输入字符串指针rp
:
case '%': /* Match the `%' character itself. */ match_char ('%', *rp++); break;
Linux手册页还说明了扩展(其中'Z'
是一个):
出于对称的原因,glibc尝试支持strptime()与strftime(3)相同的格式字符。 (在大多数情况下,会解析相应的字段,但不会更改tm中的字段。)
另外GNU文档声明(我的斜体):
%Z:时区名称。 注意:目前,这还没有完全实现。 识别格式, 消耗输入但不设置tm中的字段。
所以我实际上认为这是一个错误,虽然可以通过文档更改轻松修复,以阻止假装它可以处理Z
型时区。
我在bugzilla中找不到任何相关的bug,所以我在glibc上提出了一个bug。 你可以在这里跟踪它。
附录:根据前一段中的错误报告链接和glibc 2.19发布通知 ,我建议的更改是为了使代码与文档保持一致。 希望它没有错误,或者我看起来很傻,因为它只有五行代码。
以上就是c/c++开发分享c / c ++ strptime()不解析%Z时区名称相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560286.html