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

时间:2015-09-15 06:08:23

标签: c specifications strptime

如果日期是strptime,我还没有找到tm的适当行为的任何(或很少)迹象:

  1. 未指定:包含的数据不足以唯一填写tail = strptime("%Y %p", "2015 p.m", &tm);(例如fx tm
  2. 不一致:可能包含足够多的数据来填充tail = strptime("%Y-%m-%d %T %Y", "2015-09-15 07:48:29 2016", tm,但数据不一致(例如tm,注意到两年不同)
  3. 过度指定:包含足够多的数据来填充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",注意到年份是两次)
  4. 无效:给定的数据超出范围(例如"2016",注意到30个月内的第32天)。
  5. 我认为案例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),其余字段是否未修改?

1 个答案:

答案 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则给出了错误。