我正在尝试使用strptime(buf, &pattern,&result)
将包含日期的char[]
转换为tm
结构。
我正在使用这样的功能:
if(strptime(buf, &pattern,&result) == NULL)
{
printf("\nstrptime failed\n");
...
如果我的变量定义如下,一切正常:
char buf[] = "26/10/2011";
char pattern[] = "%d/%m/%y";
struct tm result;
但如果我将它们改为:
char buf[] = "2011/26/10";
char pattern[] = "%y/%d/%m";
struct tm result;
我得到“strptime失败”。请注意,我只在开头放了一年(buf
和pattern
)。
帮助表示感谢。我的最终目标是以这种格式转换字符串:2011-10-26T08:39:21
答案 0 :(得分:3)
这是因为小写%y
是世纪内的两位数年份。尝试将其更改为大写%Y
,它会正常工作。您可以从以下程序中看到:
#include <stdio.h>
#include <time.h>
int main (void) {
char buf[] = "26/10/2011";
char pattern[] = "%d/%m/%y";
struct tm result;
if (strptime (buf, pattern, &result) == NULL) {
printf("strptime failed\n");
return -1;
}
printf ("%d\n", 1900 + result.tm_year);
return 0;
}
这会输出2020
,这意味着该年份仅被视为20
的{{1}}部分,其余部分将被忽略。如果您使用大写2011
,则会输出正确的%Y
。
使用反转格式生成转换错误的代码:
2011
将#include <stdio.h>
#include <time.h>
int main (void) {
char buf[] = "2011/10/26";
char pattern[] = "%y/%m/%d";
struct tm result;
if (strptime (buf, pattern, &result) == NULL) {
printf("strptime failed\n");
return -1;
}
printf ("%d\n", 1900 + result.tm_year);
return 0;
}
值更改为2011
时,将正常工作(即输出pattern
)。
答案 1 :(得分:0)
使用我自己的'strptime'和'timestamp'命令,我得到:
$ strptime -T '%y/%d/%m' 2011/26/11
strptime: failed to convert <2011/26/11> using format <%y/%d/%m>
$ strptime -T '%Y/%d/%m' 2011/26/11
1322294400 = 2011/26/11
$ strptime -T '%d/%m/%y' 26/11/2011
1606377600 = 26/11/2011
$ timestamp 1322294400 1606377600
1322294400 = Sat Nov 26 00:00:00 2011
1606377600 = Thu Nov 26 00:00:00 2020
$
(这里的时区是美国/太平洋,目前是UTC-7。)
请注意,'%d/%m/%y'
格式会在2020年生成日期,而不是2011年。