c/c++;strtime()不分析%Z时区名称

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[

我是新来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”时,代码无法解析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;