Alb*_*ert 5 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[])
{
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;
}
Run Code Online (Sandbox Code Playgroud)
当我使用"%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
Run Code Online (Sandbox Code Playgroud)
当我将参数更改为"%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
Run Code Online (Sandbox Code Playgroud)
我错过了让strptime正确解析时区名称的内容吗?
提前致谢,
阿尔伯特
我不确定你在做什么会起作用.github上的glibc源代码就此事说:
case 'Z':
/* XXX How to handle this? */
break
Run Code Online (Sandbox Code Playgroud)
接下来是一些稍微更"粗暴"处理小写的'z'东西:-)
所以这里最有可能发生的是字符串指针没有超过EET格式字符串的时间%Z,因此当它尝试处理时%Y,它会正确地抱怨,这EET不是一个有效的年份.这是由简单的情况证实"%%",其中的代码实际上确实推进输入字符串指针rp:
case '%':
/* Match the `%' character itself. */
match_char ('%', *rp++);
break;
Run Code Online (Sandbox Code Playgroud)
Linux手册页还说明了扩展(其中'Z'一个):
出于对称的原因,glibc尝试支持strptime()与strftime(3)相同的格式字符.(在大多数情况下,会解析相应的字段,但不会更改tm中的字段.)
另外GNU文档声明(我的斜体):
%Z:时区名称.注意:目前,这还没有完全实现.识别格式,消耗输入但不设置tm中的字段.
所以我实际上认为这是一个错误,虽然可以通过文档更改轻松修复,以阻止假装它可以处理Z类型的时区.
我在bugzilla中找不到任何相关的bug,所以我在glibc上提出了一个bug.你可以在这里跟踪它.
附录:根据前一段中的错误报告链接和glibc 2.19发布通知,我建议的更改是为了使代码与文档保持一致.希望它没有错误,或者我看起来很傻,因为它只有五行代码.
| 归档时间: |
|
| 查看次数: |
6838 次 |
| 最近记录: |