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')
……但这似乎是胡扯。有谁知道是否可以使strptime
Linux 上的行为更加严格,并且%Y
如果输入字符串没有四位数年份则失败?