У меня есть эта функция, которая получает день до даты ввода:
Date dateDayBefore(char* inputDate)
{
struct tm dayBefore = { 0 };
char** fields = split(inputDate, 3, "/");
dayBefore.tm_mday = atoi(fields[0]);
dayBefore.tm_mon = atoi(fields[1]) - 1;
dayBefore.tm_year = atoi(fields[2]) - 1900;
dayBefore.tm_mday--;
mktime(&dayBefore);
char yesterday[10];
strftime(yesterday, sizeof(yesterday), "%d/%m/%Y", &dayBefore);
Date yesterdayDate = dateCreate(yesterday);
yesterdayDate.year += 1900;
return yesterdayDate;
}
Предположим, что все другие используемые функции верны (такие как split и dateCreate), они используются в других местах, где все так, как ожидалось.
struct dayBefore
будет содержать год, но string yesterday
не будет рассматривать его после strftime
Для: inputDate = 15.06.2020
ожидаемый результат: 06.14.2020
фактический результат: 14.06.1900
Несколько скриншотов отладки:
dateCreate
? Ваша проблема связана с тем, чтоyesterday
является локальным для функции? Предоставьте минимальную, запускаемую демонстрацию проблемы. (См. минимально воспроизводимый пример) - person ikegami   schedule 15.06.2020strptime
и не выполняйте собственные расчеты даты. Календари безумно странные. Разберите время наstruct tm
, установите часы, минуты и секунды на0
. Создайтеtime_t
, используяmktime
, вычтите несколько минут, преобразуйте обратно вstruct tm
. - person Cheatah   schedule 15.06.2020char yesterday[10];
недостаточно большой. Вы забыли учесть NUL. - person ikegami   schedule 15.06.2020mktime
использует местное время, и не все дни имеют 00:00:00 во всех часовых поясах. (Ссылка) Если вы сначала установите TZ в UTC, это сработает. - person ikegami   schedule 15.06.2020