4

POSIX 定义了一个方便的函数,strptime可用于解析日期和时间。因此,理论上,如果我有一个格式为“YYYY-MM-DD”的日期,我应该能够strptime像这样解析它:

char myDate[] = "2012-01-01";

struct tm result;
char *end = strptime(myDate, "%Y-%m-%d", &result);

...并通过以下方式以规范表示形式将其恢复:

if (end != NULL)
{
    char outDate[11];
    strftime(outDate, sizeof(outDate), "%Y-%m-%d", &result);
    printf("%s\n", outDate);
}
else
    printf("Invalid date\n");

在 OS X 和 Linux 上,这会打印出 2012-01-01。到目前为止,一切都很好!但是,假设我的输入日期格式错误:01-01-2012。

如果我再次运行上面的代码,在 OS X 上,我会得到“无效日期”,这是预期的。但是,在 Linux 上,我得到 1-01-20 — 1 月 20 日,1(是的,第一年)。

OS X 严格遵循说明符,%Y 将字符串解析为存在四位数年份的地方。不过,Linux 需要一些自由,并将两位数解释为一年——它甚至没有假设它是 2001 年,而是将其视为第 1 年!

这可以通过将我的if声明更改为类似的东西来解决

if (end != NULL && *end == '\0')

……但这似乎是胡扯。有谁知道是否可以使strptimeLinux 上的行为更加严格,并且%Y如果输入字符串没有四位数年份则失败?

4

2 回答 2

2

没有选项可以更改 strptime() 的行为或指定格式字符串中的长度。(我查看了 glibc-2.3 中的源代码,strptime 丢弃了格式修饰符和字段宽度,所以像 "%04Y" 这样的东西不会改变任何东西)。

但正如评论中已经指出的那样,没有任何问题if (end != NULL && *end == '\0')。我建议只使用它。

于 2012-12-02T17:41:44.453 回答
0

我想你最好的选择是找到第一个破折号的索引,并根据它的值使用一个或另一个掩码。

于 2012-11-05T20:16:28.627 回答