如果日期未指定、指定过多或不一致,是否定义了 strptime 的指定行为?

Is the specified behaviour of `strptime` defined if date is underspecified, overspecified or inconsistent?

如果日期是:

,我还没有发现任何(或很少)迹象表明 strptime 的适当行为
  1. 未指定:包含的数据不足以唯一填写 tm(例如 fx tail = strptime("%Y %p", "2015 p.m", &tm);
  2. 不一致:包含的数据可能足以填充 tm,但数据不一致(例如 tail = strptime("%Y-%m-%d %T %Y", "2015-09-15 07:48:29 2016", tm,请注意给出了两个不同的年份)
  3. overspecified:包含的数据足以填充tm,但数据是一致的(例如tail = strptime("%Y-%m-%d %T %Y", "2015-09-15 07:48:29 2015",注意年份给出了两次)
  4. 无效:给定的数据超出范围(例如tail = strptime("%Y-%m-%d %T", 2015-09-32 07:48:29",注意是30天的一个月中的第32个)。

我假设情况2和4 should/could被认为是错误,应该return "2016""32 07:48:29"作为错误指示,但是否需要填写tm 结构以任何方式?

我还认为情况 3 会被认为是成功的,NULL 应该 returned 和 tm 填充。

案例1呢? Should/could这才算成功?我想案例 3 中有一点点 1(因为它没有得到毫秒),假设输入数据中没有给出的字段有 "default" 值听起来是合理的(fx缺少第二个规范可以解释为秒为零)。

或者 strptime 只是应该用按顺序收到的任何垃圾盲目填充 tm 结构?这是情况 2,strptime 会将年份设置为 2016,因为这是最后一次看到,而在情况 1 中,它不会更改 tm_year 和 [=28= 以外的任何其他字段](将其强制为 p.m),其余字段保持不变?

阅读 Jonathan Leffler 给出的 reference 后,我注意到 任何其他转换规范 [除了普通字符的白色 space] 都是通过扫描字符执行的,直到一个字符匹配下一个指令被扫描,或者直到没有更多的字符可以被扫描。然后将这些字符(与下一个指令匹配的字符除外)与与转换说明符相关联的语言环境值进行比较。 如果找到匹配项,则将适当的 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 给出错误。