如果日期是strptime
,我还没有找到tm
的适当行为的任何(或很少)迹象:
tail = strptime("%Y %p", "2015 p.m", &tm);
(例如fx tm
)tail = strptime("%Y-%m-%d %T %Y", "2015-09-15 07:48:29 2016", tm
,但数据不一致(例如tm
,注意到两年不同)tail = strptime("%Y-%m-%d %T %Y", "2015-09-15 07:48:29 2015"
,但数据是一致的(例如tail = strptime("%Y-%m-%d %T", 2015-09-32 07:48:29"
,注意到年份是两次)"2016"
,注意到30个月内的第32天)。我认为案例2和4应该/可以被视为错误,它应该返回"32 07:48:29"
和tm
作为错误指示,但是它需要填写NULL
结构中的无论如何?
我还假设案例3被视为成功,应该返回tm
并填充strptime
。
案例1怎么样?应该/可能被视为成功吗?我认为情况3中有一点点(因为它没有得到毫秒),假设输入数据中没有给出的字段有“默认”值(fx缺少第二个)是合理的-specification可以解释为秒为零。
或者tm
是否应该盲目地填写strptime
结构,而不是按顺序收到任何垃圾?情况就是2,2016
会将年份设置为tm_year
,因为这是最后一次看到的情况,而在情况1中,它不会改变除tm_hour
和{{1}之外的任何其他字段(将其强制执行为pm),其余字段是否未修改?
答案 0 :(得分:0)
在阅读Jonathan Leffler给出的reference之后,我注意到通过扫描字符执行任何其他转换规范[普通字符的空白区域除外],直到扫描与下一个指令匹配的字符为止,或者直到不再扫描任何字符。然后将这些字符(与下一个指令匹配的字符除外)与与转换说明符关联的语言环境值进行比较。 如果找到匹配项,则将相应tm结构成员的值设置为与区域设置信息对应的值。匹配buf中的项目(例如月份或工作日名称)时会忽略大小写。如果未找到匹配项,则strptime()将失败,并且不再扫描任何字符。(强调我的)。
我对它的理解是strptime
应该盲目地填写tm结构,无论按顺序收到任何垃圾。
有效地:
#include <stdio.h>
#include <time.h>
int main() {
struct tm tm = {0};
char *tail;
tail = strptime("2015 pm", "%Y %p", &tm);
printf("%s", asctime(&tm));
if (tail != NULL) printf(" [%s]", tail);
puts("\n");
tail = strptime("2015-09-15 07:48:29 2016", "%Y-%m-%d %T %Y", &tm);
printf("%s", asctime(&tm));
if (tail != NULL) printf(" [%s]", tail);
puts("\n");
tail = strptime("2015-09-15 07:48:29 2015", "%Y-%m-%d %T %Y", &tm);
printf("%s", asctime(&tm));
if (tail != NULL) printf(" [%s]", tail);
puts("\n");
tail = strptime("2015-09-32 07:48:29", "%Y-%m-%d %T", &tm);
printf("%s", asctime(&tm));
if (tail != NULL) printf(" [%s]", tail);
puts("\n");
return 0;
}
输出:
Sun Jan 0 12:00:00 2015
[]
Sun Sep 15 07:48:29 2016
[]
Sun Sep 15 07:48:29 2015
[]
Sun Sep 15 07:48:29 2015
意味着1,2和3处理没有错误,但只修改了tm结构的相关字段,但是最后一次出现,而4则给出了错误。