Это потому, что нижний регистр %y
предназначен для двузначного года в пределах века. Попробуйте изменить его на прописные %Y
, и все будет хорошо. Вы можете увидеть это из следующей программы:
#include <stdio.h>
#include <time.h>
int main (void) {
char buf[] = "26/10/2011";
char pattern[] = "%d/%m/%y";
struct tm result;
if (strptime (buf, pattern, &result) == NULL) {
printf("strptime failed\n");
return -1;
}
printf ("%d\n", 1900 + result.tm_year);
return 0;
}
Это выводит 2020
, означая, что год читается как просто 20
часть 2011
, а остальная часть игнорируется. Если вы используете %Y
в верхнем регистре, вместо него выводится правильный 2011
.
Код, который генерирует ошибку преобразования в обратном формате:
#include <stdio.h>
#include <time.h>
int main (void) {
char buf[] = "2011/10/26";
char pattern[] = "%y/%m/%d";
struct tm result;
if (strptime (buf, pattern, &result) == NULL) {
printf("strptime failed\n");
return -1;
}
printf ("%d\n", 1900 + result.tm_year);
return 0;
}
будет работать нормально (т.е. вывод 2011
) при изменении значения pattern
на "%Y/%m/%d"
.