C语言 strptime() 读取相对于 1900AD 的年份



我正在使用一个我知道不是标准C库一部分的函数。我在这里找到了有关它的信息:21.4.6.1 根据给定格式解释字符串。

这是一个非常有用的功能,完全符合我的需求。但是,当以这种非常简单的方式使用它时:

#include <stdio.h>
#include <time.h>
int main()
{
struct tm timedata;
strptime("1/1/1", "%d/%m/%Y", &timedata);
printf("day: %dnmonth: %dnyear: %dn", 
timedata.tm_mday, timedata.tm_mon, timedata.tm_year);
}

奇怪的数据被放置在struct tmtimedata中。输出为:

day: 1
month: 0
year: -1899

这对我来说没有多大意义。1/1/1应导致:

day: 1
month: 1
year: 1

据我所知,在阅读 GNU 手册时,这种行为是意料之中的。例如:

%Y 以十进制数表示的年份,使用公历。

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

编辑:

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

#include <stdio.h>
#include <time.h>
int main()
{
struct tm timedata;
if(strptime("1/1/1", "%d/%m/%Y", &timedata))
{
printf("day: %dnmonth: %dnyear: %dn", 
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: %dnmonth since January: %dnyear since 1900: %dn",
timedata.tm_mday, timedata.tm_mon, timedata.tm_year);
printf("day: %dnmonth: %dnyear: %dn", 
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 库中。

最新更新