strptime() 读取相对于公元 1900 年的年份
strptime() reads years relative to 1900AD
我使用的函数据我所知不属于标准 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.
我上次检查时,公历不是从 1900A.D 开始的。
编辑:
重写代码以检查 return 函数值。同样的问题仍然存在。
#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 认为相同的偏移量。
// 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 中定义,也在 POSIXy 系统中使用 man 3 strptime 进行了记录。它不在标准 C 库中。
我使用的函数据我所知不属于标准 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.
我上次检查时,公历不是从 1900A.D 开始的。
编辑:
重写代码以检查 return 函数值。同样的问题仍然存在。
#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 认为相同的偏移量。
// 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 中定义,也在 POSIXy 系统中使用 man 3 strptime 进行了记录。它不在标准 C 库中。