gpt4 book ai didi

c - strptime() 读取相对于公元 1900 年的年份

转载 作者:太空宇宙 更新时间:2023-11-04 02:29:45 24 4
gpt4 key购买 nike

我正在使用一个据我所知不属于标准 C 库的函数。我在这里找到了相关信息:21.4.6.1 Interpret string according to given format .

这是一个非常有用的功能,完全可以满足我的需要。然而,当以这种非常简单的方式使用它时:

#include <stdio.h>
#include <time.h>

int main()
{
struct tm timedata;
strptime("1/1/1", "%d/%m/%Y", &timedata);
printf("day: %d\nmonth: %d\nyear: %d\n",
timedata.tm_mday, timedata.tm_mon, timedata.tm_year);
}

奇怪的数据放在struct tm timedata中。输出是:

day: 1
month: 0
year: -1899

这对我来说意义不大。 1/1/1 应该导致:

day: 1
month: 1
year: 1

据我所知,阅读 GNU 手册时不会出现这种行为。例如:

%Y The year as a decimal number, using the Gregorian calendar.

我上次查的时候,公历不是从公元 1900 年开始的。

编辑:

重写代码以检查函数的返回值。同样的问题仍然存在。

#include <stdio.h>
#include <time.h>

int main()
{
struct tm timedata;
if(strptime("1/1/1", "%d/%m/%Y", &timedata))
{
printf("day: %d\nmonth: %d\nyear: %d\n",
timedata.tm_mday, timedata.tm_mon, timedata.tm_year);
}else{
printf("Error");
}
}

输出:

day: 1
month: 0
year: -1899

最佳答案

代码工作正常。 struct tm 不使用与 OP 认为相同的偏移量。 @underscore_d

// C11dr §7.27.1 4
int tm_mon; // months since January — [0, 11]
int tm_year; // years since 1900

int main() {
struct tm timedata;
char *p = strptime("1/1/1", "%d/%m/%Y", &timedata);
if (p) {
printf("day: %d\nmonth since January: %d\nyear since 1900: %d\n",
timedata.tm_mday, timedata.tm_mon, timedata.tm_year);
printf("day: %d\nmonth: %d\nyear: %d\n",
timedata.tm_mday, timedata.tm_mon + 1, timedata.tm_year + 1900);
} else {
puts("Failed");
}
}

输出

day: 1
month since January: 0
year since 1900: -1899
day: 1
month: 1
year: 1

注意:strptime() 在 POSIX.1-2001 和 POSIX.1-2008 中定义,也在使用 man 3 strptime 的 POSIXy 系统中记录。它不在标准 C 库中。

关于c - strptime() 读取相对于公元 1900 年的年份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45060653/

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