gpt4 book ai didi

linux - 在 Linux 上严格解析 YYYY-MM-DD 日期

转载 作者:IT王子 更新时间:2023-10-29 00:36:29 27 4
gpt4 key购买 nike

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 日(是的,第一年)。

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

这可以通过将我的 if 语句更改为类似的语句来解决

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

……但这似乎很不靠谱。有谁知道是否可以让 strptime 在 Linux 上表现得更严格,如果输入字符串没有四位数年份则 %Y 失败?

最佳答案

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

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

关于linux - 在 Linux 上严格解析 YYYY-MM-DD 日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13056573/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com