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 tmtimedata。输出为:

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 库中。