首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c/c++ strptime()无法解析%Z时区名称

c/c++ strptime()无法解析%Z时区名称
EN

Stack Overflow用户
提问于 2012-11-26 06:31:21
回答 1查看 8.7K关注 0票数 5

我对C语言还不熟悉。当我练习C语言时,我用隐蔽的时间来构造tm。我注意到了一些不同。请指教我做错了什么。

代码语言:javascript
复制
#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”作为转换格式参数时,代码提供了如下结果:

代码语言:javascript
复制
 ~/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生成的格式完全相同的时间字符串。

代码语言:javascript
复制
 ~/user$ ./test_time " %A, %b %d, %X %Z %Y "
  Tuesday, Mar 06, 12:33:45 EET 2001 
 0
 error

我是不是错过了让strptime正确解析时区名称的东西?

提前谢谢你,

阿尔伯特

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-26 06:45:06

我不确定你所做的会不会奏效。github的glibc source code在这个问题上是这样说的:

代码语言:javascript
复制
case 'Z':
    /* XXX How to handle this? */
    break

然后是对小写'z'的一些稍微“有肉”的处理:-)

因此,这里最可能发生的情况是,当格式字符串为%Z时,字符串指针不会超过EET,因此当它试图处理%Y时,它会正确地报告EET不是有效的年份。在"%%"的简单情况下,代码实际上前进了输入字符串指针rp,证实了这一点

代码语言:javascript
复制
case '%':
    /* Match the `%' character itself.  */
    match_char ('%', *rp++);
    break;

Linux手册页还说明了扩展( 'Z'就是其中之一):

出于对称的原因,glibc尝试为strptime()支持与strftime(3)相同的格式字符。(在大多数情况下,会解析相应的字段,但不会更改tm中的字段。)

此外,GNU docs状态(我的斜体):

%Z:时区名称。注意:目前还没有完全实现。格式被识别,输入被使用,但没有设置tm中的字段。

因此,我实际上认为这是一个错误,尽管这个错误可以通过更改文档轻松修复,以停止假装它可以处理Z-type时区。

我在bugzilla中找不到任何相关的bug,所以我在glibc上提出了一个bug。你可以在here上追踪它。

附录:根据上一段中的错误报告链接和glibc 2.19 release notice,我建议的更改是为了使代码与文档保持一致。希望里面没有bug,否则我看起来会很傻,因为它只有五行代码。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13556260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档