有没有办法让strptime()
来处理固定格式的时间string?
我需要parsing一个总是固定宽度格式的时间string:“ yymmdd HHMMSS
”,但是有些前导零有时会出现,有时不会。
阅读strptime
的man(3p)页面,我注意到对于所有的转换说明符%y, %m, %d, %H, %M, %S
,注释:“前导零应被允许但不得需要。”。 因此,我尝试格式说明符%y%m%d %H%M%S
,天真希望strptime
会认识到两个子string%y%m%d
和%H%M%S
中的空格相当于(缺less)领先零。
这似乎适用于说明符%m
,但不适用于%M
(好吧,除非第二部分小于10),如下面的代码段
#include <stdio.h> #include <time.h> int main() { struct tm buff; const char ts[]="17 310 22 312"; char st[14]; strptime(ts,"%y%m%d %H%M%S", &buff); strftime(st,14,"%y%m%d %H%M%S",&buff); printf("%s\n",ts); printf("%s\n",st); return 0; }
编译并在我的机器输出上运行
17 310 22 312 170310 223102
任何有关如何解决这个问题的见解,我将不胜感激,或者我需要求助于手动切断string2字符在这个时候使用atoi
转换为整数来填充我的struct tm
实例?
这将是最好的获取生成的数据与固定的奇怪格式的代码。
假设今天早上不能完成,那么也许你应该规范(复制)这样的数据:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> static inline void canonicalize(char *str, int begin, int end) { for (int i = begin; i <= end; i++) { if (str[i] == ' ') str[i] = '0'; } } int main(void) { struct tm buff; const char ts[] = "17 310 22 312"; char st[32]; char *raw = strdup(ts); printf("[%s] => ", raw); canonicalize(raw, 0, 5); canonicalize(raw, 7, 12); printf("[%s] => ", raw); strptime(raw, "%y%m%d %H%M%S", &buff); strftime(st, sizeof(st), "%y%m%d %H%M%S", &buff); printf("[%s] => ", st); strftime(st, sizeof(st), "%Y-%m-%d %H:%M:%S", &buff); printf("[%s]\n", st); free(raw); return 0; }
canonicalize()
函数将字符串的给定范围内的零替换为空值。 很明显,如果你指定的出发点和结束点超出范围,它将会走出界限。 我保留了const
,并用strdup()
复制了一个副本。 如果您可以将字符串视为可变数据,则不需要制作(或免费)副本。
该代码的输出是:
[17 310 22 312] => [170310 220312] => [170310 220312] => [2017-03-10 22:03:12]